利用兩個隊列來實現(xiàn)一個棧的功能
樣例
push(1)
pop()
push(2)
isEmpty() // return false
top() // return 2
pop()
isEmpty() // return true
思路
一個 queue 用來存所有 push 進來的元素庸诱,另一個 queue 用來輔助,在要 top() 或者 pop() 的時候,因為要讀取隊尾的元素,可以將 queue1 中的元素彈出到只剩一個元素,彈出的元素由 queue2 接收,因為 queue 是先進先出才漆,所以 queue2 中的元素順序跟原先 queue1 中的元素順序相同,
這之后 queue1 中剩下的那個元素就是需要的棧頂元素。如果是 top 方法那么只是讀取這個元素褥影,所以彈出之后再 offer 回來就可以了。
代碼
class Stack {
private Queue<Integer> queue1;
private Queue<Integer> queue2;
public Stack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
private void moveItems() {
while (queue1.size() != 1) {
queue2.offer(queue1.poll());
}
}
// O(1) 的時間操作;
private void swapQueues() {
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
/**
* push a new item into the stack
*/
public void push(int value) {
queue1.offer(value);
}
/**
* return the top of the stack
*/
public int top() {
moveItems();
int item = queue1.poll();
swapQueues();
// 把元素重新添加到隊列中去咏雌,保持原樣凡怎,因為 top 不改變棧中的值
// 實際上就是先把 queue1 中元素移到 queue2 中去,然后交換兩個隊列
// queue1 變成 queue2赊抖,queue2 變成 queue1
queue1.offer(item);
return item;
}
/**
* pop the top of the stack and return it
*/
public void pop() {
moveItems();
queue1.poll();
swapQueues();
}
/**
* check the stack is empty or not.
*/
public boolean isEmpty() {
return queue1.isEmpty();
}
}