当前位置 博文首页 > 知北行的博客:算法---LeetCode 232. 用栈实现队列

    知北行的博客:算法---LeetCode 232. 用栈实现队列

    作者:[db:作者] 时间:2021-08-14 18:10

    1. 题目

    原题链接

    请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
    实现 MyQueue 类:

    void push(int x) 将元素 x 推到队列的末尾
    int pop() 从队列的开头移除并返回元素
    int peek() 返回队列开头的元素
    boolean empty() 如果队列为空,返回 true ;否则,返回 false

    说明:

    你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。

    你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

    进阶:

    你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。

    示例:

    输入:
    [“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
    [[], [1], [2], [], [], []]
    输出:
    [null, null, null, 1, 1, false]
    解释:
    MyQueue myQueue = new MyQueue();
    myQueue.push(1); // queue is: [1]
    myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
    myQueue.peek(); // return 1
    myQueue.pop(); // return 1, queue is [2]
    myQueue.empty(); // return false

    2. 题解

    2.1 解法1: 两个栈

    维护一个入队栈, 一个出队栈
    当要入队时, 将元素直接加入入队栈即可
    当要出队时, 若出队栈不为空, 直接弹出出队栈栈顶即可, 若为空, 则先将入队栈所有元素出栈加入出队栈

        class MyQueue {
            Deque<Integer> pushStack;
            Deque<Integer> popStack;
    
            /**
             * Initialize your data structure here.
             */
            public MyQueue() {
                pushStack = new ArrayDeque<>();
                popStack = new ArrayDeque<>();
            }
    
            /**
             * Push element x to the back of queue.
             */
            public void push(int x) {
                pushStack.addLast(x);
            }
    
            /**
             * Removes the element from in front of queue and returns that element.
             */
            public int pop() {
                if (!popStack.isEmpty()) {
                    return popStack.pollLast();
                }
                while (!pushStack.isEmpty()) {
                    popStack.addLast(pushStack.pollLast());
                }
                return popStack.pollLast();
            }
    
            /**
             * Get the front element.
             */
            public int peek() {
                if (!popStack.isEmpty()) {
                    return popStack.peekLast();
                }
                while (!pushStack.isEmpty()) {
                    popStack.addLast(pushStack.pollLast());
                }
                return popStack.peekLast();
    
            }
    
            /**
             * Returns whether the queue is empty.
             */
            public boolean empty() {
                return pushStack.isEmpty() && popStack.isEmpty();
            }
        }
    
    

    参考:
    负负得正,使用两个栈,一个专门入队,一个专门出队
    【栈】用栈实现队列

    cs