题目网址:https://leetcode-cn.com/problems/implement-stack-using-queues/
我们知道栈的出入栈方式是:后进先出
队列的方式是:先进先出
让队列实现栈,我们就需要用到两个队列了。
这里我们创建两个队列A,B
我这里直接用链表来实现
LinkedList<Integer> A = new LinkedList<>();
LinkedList<Integer> B = new LinkedList<>();
注意我这么写是为了我后续能够用到removeFirst和addLast 的操作
如果我这么写
Queue<Integer> A = new LinkedList<>();
Queue<Integer> B = new LinkedList<>();
A 和B是队列(QUEUE)的引用,就只能实现队列的核心操作,而不是链表的操作了
创建完两个链表后,我们让A链表来实现入栈操作,而B链表来辅助完成出栈和取栈顶操作
入栈就直接offer
出栈如下图
将A中的元素取出(由于是先进先出就是 1 2 3)
并且入B的队列(顺序也是1 2 3)
此时,A还剩一个4,这个4,就是最后入A的元素,将其不要并返回它的值,就完成了出栈
最后A和B交换引用。完成
取栈顶元素,只需要将最后的4取出,并将其插入到B中,返回它的值,最后在交换AB引用,这样,既可以实现栈中取最后入的元素值,又可以保持原有的队列,进行其他操作。
需要注意:A指向的永远是一个有效队列,这里是链表,判空插入都靠它
B是用来辅助A的,B永远是个空链表。
class MyStack {
/** Initialize your data structure here. */
public MyStack() {
}
LinkedList<Integer> A = new LinkedList<>();
LinkedList<Integer> B = new LinkedList<>();
/** Push element x onto stack. */
public void push(int x) {
A.offer(x);
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
//出栈
if(A.size() == 0){
return 0;
}
while (A.size() > 1){
int cur = A.removeFirst();
B.addLast(cur);
}
int ret = A.removeFirst();
swap();
return ret;
}
public void swap(){
LinkedList<Integer> tmp = A;
A = B;
B = tmp;
}
/** Get the top element. */
public int top() {
if(A.size() == 0){
return 0;
}
while (A.size() > 1){
int cur = A.removeFirst();
B.addLast(cur);
}
int ret = A.removeFirst();
B.addLast(ret);
swap();
return ret;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return A.size() == 0;
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/