zoukankan      html  css  js  c++  java
  • LeetCode-225-用队列实现栈

    用队列实现栈

    题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。

    实现 MyStack 类:

    • void push(int x) 将元素 x 压入栈顶。
    • int pop() 移除并返回栈顶元素。
    • int top() 返回栈顶元素。
    • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

    示例说明请见LeetCode官网。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/implement-stack-using-queues/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解法一:双队列实现栈

    使用2个队列firstQueue和secondQueue存储数据,具体方法说明如下:

    • push(int x):如果firstQueue为空,则将x存到secondQueue中,否则存到firstQueue中;
    • pop():如果firstQueue为空,则将secondQueue中的数据都取出然后依次存入firstQueue中只留一个作为栈顶元素取出并返回;否则,将firstQueue中的数据都取出然后依次存入secondQueue中只留一个作为栈顶元素取出并返回;
    • top():逻辑通pop()方法类似;
    • empty():如果firstQueue和secondQueue都为空,返回true;否则,返回false。
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class LeetCode_225 {
        public static void main(String[] args) {
            MyStack myStack = new MyStack();
            myStack.push(1);
            myStack.push(2);
            myStack.push(3);
            System.out.println(myStack.top()); // 返回 2
            System.out.println(myStack.pop()); // 返回 2
            System.out.println(myStack.empty()); // 返回 False
        }
    }
    
    class MyStack {
        private Queue<Integer> firstQueue;
        private Queue<Integer> secondQueue;
    
        /**
         * Initialize your data structure here.
         */
        public MyStack() {
            firstQueue = new LinkedList<>();
            secondQueue = new LinkedList<>();
        }
    
        /**
         * Push element x onto stack.
         */
        public void push(int x) {
            if (firstQueue == null) {
                secondQueue.add(x);
            } else {
                firstQueue.add(x);
            }
        }
    
        /**
         * Removes the element on top of the stack and returns that element.
         */
        public int pop() {
            if (this.empty()) {
                throw new RuntimeException("empty stack.");
            }
            if (firstQueue.isEmpty()) {
                int size = secondQueue.size();
                for (int i = 1; i < size; i++) {
                    firstQueue.add(secondQueue.poll());
                }
                return secondQueue.poll();
            } else {
                int size = firstQueue.size();
                for (int i = 1; i < size; i++) {
                    secondQueue.add(firstQueue.poll());
                }
                return firstQueue.poll();
            }
        }
    
        /**
         * Get the top element.
         */
        public int top() {
            if (this.empty()) {
                throw new RuntimeException("empty stack.");
            }
            int result = -1;
            if (firstQueue.isEmpty()) {
                int size = secondQueue.size();
                for (int i = 1; i < size; i++) {
                    firstQueue.add(secondQueue.poll());
                }
                result = secondQueue.peek();
                firstQueue.add(secondQueue.poll());
            } else {
                int size = firstQueue.size();
                for (int i = 1; i < size; i++) {
                    secondQueue.add(firstQueue.poll());
                }
                result = firstQueue.peek();
                secondQueue.add(firstQueue.poll());
            }
            return result;
        }
    
        /**
         * Returns whether the stack is empty.
         */
        public boolean empty() {
            return firstQueue.isEmpty() && secondQueue.isEmpty();
        }
    }
    

    【每日寄语】 哪怕生活不宠你,也要好好善待自己。这一生,风雨兼程,就是为了遇见最好的自己。

  • 相关阅读:
    [转] 在安卓设备上使用 Chrome 远程调试功能
    如何在移动设备上调试网页
    [转] 函数式编程初探
    如何简单区分Web前后端与MVC
    [转] 钉钉的H5性能优化方案
    js 数组赋值问题 :值传递还是引用?
    (转载)How browsers work--Behind the scenes of modern web browsers (前端必读)
    [转] React 最佳实践——那些 React 没告诉你但很重要的事
    RAII惯用法详解
    [2] 智能指针
  • 原文地址:https://www.cnblogs.com/kaesar/p/14998180.html
Copyright © 2011-2022 走看看