美文网首页
2021.3.5每日一题

2021.3.5每日一题

作者: Yaan9 | 来源:发表于2021-03-05 10:30 被阅读0次

    232. 用栈实现队列

    请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(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
    

    题解

    可以把一个栈当做「输入栈」,把另一个栈当做「输出栈」。
    当 push() 新元素的时候,放到「输入栈」的栈顶,记此顺序为「输入序」。
    当 pop() 元素的时候,是从「输出栈」弹出元素。如果「输出栈」为空,则把「输入栈」的元素逐个 pop() 并且 push() 到「输出栈」中,这一步会把「输入栈」的栈底元素放到了「输出栈」的栈顶。此时负负得正,从「输出栈」的 pop() 元素的顺序与「输入序」相同。

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

    相关文章

      网友评论

          本文标题:2021.3.5每日一题

          本文链接:https://www.haomeiwen.com/subject/pslrqltx.html