两个栈实现队列

栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO)。

解题思路:
用一个栈(栈a)来模拟入队,另一个栈(栈b)来模拟出队过程。
入队过程:直接把元素压入栈a中。
出队过程:当栈b为空时,讲栈a中的元素出栈并以此压入栈b中,然后依次出栈。

假设现有三个元素:3,4,5,用两个栈来模拟队列。
刚开始,将3,4压入栈a中(入队列),此时的情况为:栈a:{3,4},栈b:{空}。
然后马上将栈a的元素压入栈b中,此时的情况变为:栈a:{空},栈b:{4,3}。
还有最后一个元素5,将它压入栈a中(入队列),此时的情况为:栈a:{5},栈b:{4,3}。
此题的关键在于,当栈b为空时才可将栈a的元素压入。
此时正确的操作应为:栈b的3,4出栈(出队列),等栈空了以后,5再由栈a入栈b,最后5出栈b(出队列)。
而如果5在栈b弹出元素3后就压入栈b,此时4还在栈b中,5进来后4就被“压在下面”了,最终栈b的弹出顺序变成:3,5,4。所以,栈b为空时才可压入栈a里的元素。

java代码:

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node) {
        stack1.push(node);
    }

    public int pop() {
        if (stack2.empty()) {
            while (!stack1.empty()) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}
posted @ 2020-10-19 18:56  cyreal1997  阅读(83)  评论(0)    收藏  举报