push()์ ์ฌ์ฉํ Queue๋ฅผ q1, pop()์ ์ฌ์ฉํ Queue๋ฅผ q2๋ผ๊ณ ํ์๋ค.
[ push() ]
q1.add()๋ฅผ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
[ pop() ]
q1์์ popํ 1๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๋๊ณ , ๋๋จธ์ง n-1๊ฐ์ ๋ฐ์ดํฐ๋ฅผ q2๋ก ์ด๋์ํจ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ q2๋ก ์ฎ๊ฒจ์ง๋ค. q1์ ๋จ์์๋ ๋ฐ์ดํฐ๋ฅผ q1.remove()ํ์ฌ ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค. ๋ค์์ ์งํ๋ pop()์ ์ํด q2๊ฐ ๋น์ด์์ง ์์ ๊ฒฝ์ฐ, q1๊ณผ q2์ ์ด๋ฆ์ swapํ๋ค.
๊ตฌํ ์ฝ๋
import java.util.LinkedList;
import java.util.Queue;
public class QueueStack<E> {
Queue<E> q1;
Queue<E> q2;
public QueueStack() {
this.q1 = new LinkedList<>();
this.q2 = new LinkedList<>();
}
public void push(E e) {
q1.add(e);
}
public E pop() {
// popํ ๋ฐ์ดํฐ ํ๊ฐ๋ง ๋จ๊ธฐ๊ณ ์ด๋
while (q1.size() > 1) {
q2.add(q1.remove());
}
E result = q1.remove();
// q1, q2 swap
if (!q2.isEmpty()) {
Queue<E> tmp = q1;
q1 = q2;
q2 = tmp;
}
return result;
}
}
public class Main {
public static void main(String[] args) {
QueueStack<Integer> qStack = new QueueStack<>();
qStack.push(1);
qStack.push(2);
qStack.push(3);
qStack.push(4);
qStack.push(5);
System.out.println(qStack.pop());
System.out.println(qStack.pop());
System.out.println(qStack.pop());
System.out.println(qStack.pop());
System.out.println(qStack.pop());
}
}
์๊ฐ๋ณต์ก๋
push()๋ add()๋ฅผ ํ๋ฒ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
pop()์ q1์ ์ ์ฅ๋์ด ์๋ n๊ฐ์ ๋ฐ์ดํฐ ์ค n-1๊ฐ๋ฅผ q2๋ก ์ฎ๊ฒจ์ผ ํ๋ฏ๋ก, O(n)์ด ๋๋ค.