CS-Notes全部笔记在阅读器中打开

9. 用两个栈实现队列

题目链接

Leetcode

题目描述

用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。

解题思路

in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。

需要注意的是,只有 out 栈为空时才把 in 栈的元素全部倒进去;out 栈中还有元素时倒入,新元素会压在旧元素上面,先出栈,顺序就乱了。每个元素最多进出 in 栈、out 栈各一次,因此 deleteHead 的均摊时间复杂度为 O(1)。

解题思路的配图

class CQueue {
    private Stack<Integer> in = new Stack<>();
    private Stack<Integer> out = new Stack<>();

    public CQueue() {

    }

    public void appendTail(int value) {
        in.push(value);
    }

    public int deleteHead() {
        if (out.isEmpty()) {
            while (!in.isEmpty()) {
                out.push(in.pop());
            }
        }
        if (out.isEmpty()) {
            return -1;
        }
        return out.pop();
    }
}

在阅读器中可以用目录和搜索、切换深色模式、练习这篇笔记中的面试题:打开《9. 用两个栈实现队列》