• LeetCode 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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

    在这里插入图片描述
    提示:
    1 <= x <= 9
    最多调用 100 次 push、pop、peek 和 empty
    假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

    思路

    因为队列为先进先出。而栈为先进后出,顺序刚好相反。那么我们只需要准备两个栈,s1和s2。
    将数据分别通过栈s1和s2.即可做到先进先出。

    但需要注意的是,因为可能连续push多个数,pop一次,然后继续push多个数。那么就形成了连续的段1和连续的段2。我们将段1放入s2后。需要先将此时s2的栈顶返回,才是我们想要pop的数,然后再继续放入段2。如果是将段1和段2都放入s2时再返回s2的栈顶,不会是我们想要pop的数。因为此时s2中只是段间符合队列的顺序,但段与段之间不符合队列的顺序。

    同时我们也因为push的不连续性和push时先都将数只缓存在s1的操作,只有在查询队列队头或者弹出队头时才涉及s2的操作,导致s1和s2都是有可能为空的。我们要判断整个队列是否为空,需要看s1和s2是否同时为空。
    ①s1为空,s2不为空的情况:s1的数已经全部赋给s2了。此时s2就是队列。
    ②s2为空,s1不为空的情况:正在连续push数中,s1此时为队列的逆序顺序。

    代码

    class MyQueue {
        Stack<Integer> s1 = new Stack<Integer>();
        Stack<Integer> s2 = new Stack<Integer>();
    
        public MyQueue() {
    
        }
        
        public void push(int x) {
            s1.push(x);
        }
        
        public int pop() {
            if(s2.empty()){
                while(!s1.empty()){
                s2.push(s1.peek());
                s1.pop();
            }
            }
            int ans = (int)s2.peek();
            s2.pop();
            return ans;
        }
        
        public int peek() {
            if(s2.empty()){
            while(!s1.empty()){
                s2.push(s1.peek());
                s1.pop();
            }}
            return s2.peek();
        }
        
        public boolean empty() {
            return s1.empty()&&s2.empty();
        }
    }
    
    
     */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    效率

    0ms,击败100.00%使用 Java 的用户。应该不用再优化了。

  • 相关阅读:
    CAN通信(2)——CAN通信协议层
    Matlab图像处理-HSI模型
    编程杂谈|十余年后再做课堂练习题
    监控Spark运行超时及kill掉重跑
    TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性
    实现国产化转型,ZStack Cloud 助力中铁财务数字化转型!
    elasticSearch+kibana+logstash+filebeat集群改成https认证
    STC单片机RAM在KEIL编程使用
    GBase 8c V3.0.0数据类型——窗口函数
    【由果索因】模块化代码后,这样的JavaScript技巧才值得用
  • 原文地址:https://blog.csdn.net/zhiaidaidai/article/details/134770105