• 由两个栈组成的队列


    题目

    使用栈实现队列的下列操作:

    push(x) -- 将一个元素放入队列的尾部。
    pop() -- 从队列首部移除元素。
    peek() -- 返回队列首部的元素。
    empty() -- 返回队列是否为空。
    

    示例:

    MyQueue queue = new MyQueue();
    
    queue.push(1);
    queue.push(2);  
    queue.peek();  // 返回 1
    queue.pop();   // 返回 1
    queue.empty(); // 返回 false
    

    说明:

    • 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
    • 你所使用的语言也许不支持栈。你可以使用list或者deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
    • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

    思路

    设计时使用两个栈
    一个栈作为压入栈,记为stack_in
    一个栈作为弹出栈,记为stack_out

    1.当有数据入队列时,压入stack_in

    2.当有数据出队列时,从stack_out弹出,如果stack_out为空,则循环遍历stack_in,将stack_in中的元素全部弹出,并按弹出顺序全部压入栈stack_out,循环结束后从stack_out弹出栈顶元素即可

    代码

    class MyQueue:
    
        def __init__(self):
            """
            Initialize your data structure here.
            """
            self.stack_in = []
            self.stack_out = []
            
    
        def push(self, x: int) -> None:
            """
            Push element x to the back of queue.
            """
            self.stack_in.append(x)
    
        def pop(self) -> int:
            """
            Removes the element from in front of queue and returns that element.
            """
            if not self.stack_out:
                while self.stack_in:
                    self.stack_out.append(self.stack_in.pop())
                return self.stack_out.pop()
            else:
                return self.stack_out.pop()
            
    
        def peek(self) -> int:
            """
            Get the front element.
            """
            if not self.stack_out:
                while self.stack_in:
                    self.stack_out.append(self.stack_in.pop())
                return self.stack_out[-1]
            else:
                return self.stack_out[-1]
            
    
        def empty(self) -> bool:
            """
            Returns whether the queue is empty.
            """
            if self.stack_out or self.stack_in:
                return False
            else:
                return True
    

    复杂度分析

    入队

    • 时间复杂度:O(1):向栈压入元素的时间复杂度为O(1)

    • 空间复杂度:O(n):需要额外的内存来存储队列元素

    出队

    • 时间复杂度: 摊还复杂度 O(1),最坏情况下的时间复杂度 O(n)
      在最坏情况下,stack_out为空,算法需要从 stack_in 中弹出 n 个元素,然后再把这 n个元素压入 stack_out

    • 空间复杂度 :O(1)


    公众号:《程序员养成记》 

    主要写算法、计算机基础之类的文章, 有兴趣来关注一起成长!

    版权声明 :著作权归作者所有,非商业转载请注明出处,禁止商业转载。

  • 相关阅读:
    SQL SERVER 2008的元数据视图
    SQL Server 2008 中的 XML 功能
    SQL SERVER 2008的层次结构支持
    C#打包程序
    SQL SERVER 2008的top增强
    SQL SERVER导出数据字典
    SQL SERVER 2008的转置函数PIVOT
    SQL SERVER 2008的SQLCMD模式
    SQL SERVER 2008传递表值参数
    SQL Server 2005导出表中数据的SQL脚本形式(即INSERT语句)
  • 原文地址:https://www.cnblogs.com/magicroc/p/11876487.html
Copyright © 2020-2023  润新知