题目网址: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(); */