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

示例

输入:
["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

提示

进阶

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

思路分析

分析:准备 2 个栈: inStack、 outStack

  • 入队时, push 到 inStack 中
    在这里插入图片描述
  • 出队时,情况一:如果 outStack 为空,将 inStack 所有元素逐一弹出, push 到 outStack, outStack 再弹出栈顶元素【11出队】
    在这里插入图片描述
  • 出队时,情况二:如果 outStack 不为空, outStack 弹出栈顶元素【11】
    在这里插入图片描述

实例:假设如下操作: 11入队、 22入队、出队(11)、 33入队、出队(22——>33)

  • 第一步:准备 2个空的 Stack
    在这里插入图片描述
  • 第二步:11入队、22入队
    在这里插入图片描述
  • 第三步:11 出队:情况一:如果 outStack 为空,将 inStack 所有元素逐一弹出, push 到 outStack, outStack 再弹出栈顶元素【11弹出】
    在这里插入图片描述
    在这里插入图片描述
  • 第四步:33入队
    在这里插入图片描述
  • 第五步:22 出队:情况二:如果 outStack 不为空, outStack 弹出栈顶元素【22】
    在这里插入图片描述
  • 第六步:33 出队:情况一
class MyQueue:

    def __init__(self):
        """
        Initializer your data structure here.
        """
        self.s1 = []
        self.s2 = []
        self.front = None


    # 入队
    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        if not self.s1: self.front = x
        self.s1.append(x)

    # 出队
    def pop(self) -> int:
        """
        Removes the element from in front of queue and return that element.
        """
        if not self.s2:
            while self.s1:
                self.s2.append(self.s1.pop())
            self.front = None
        return self.s2.pop()

    # 获取对头元素
    def peek(self) -> int:
        """
        Get the front element.
        """
        if self.s2:
            return self.s2[-1]
        return self.front

    # 是否为空
    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        if not self.s1 and not self.s2:
            return True
        return False



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()

版权声明:本文为博主原创文章,未经博主允许不得转载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InitialHeart2021

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值