python-leetcode-225. 用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)

可以使用两个队列来实现一个后入先出的栈。以下是 MyStack 类的实现:

from collections import deque

class MyStack:
    def __init__(self):
        self.queue1 = deque()
        self.queue2 = deque()

    def push(self, x: int) -> None:
        self.queue1.append(x)

    def pop(self) -> int:
        while len(self.queue1) > 1:
            self.queue2.append(self.queue1.popleft())
        top_element = self.queue1.popleft()
        self.queue1, self.queue2 = self.queue2, self.queue1  # Swap queues
        return top_element

    def top(self) -> int:
        while len(self.queue1) > 1:
            self.queue2.append(self.queue1.popleft())
        top_element = self.queue1.popleft()
        self.queue2.append(top_element)  # Put it back
        self.queue1, self.queue2 = self.queue2, self.queue1  # Swap queues
        return top_element

    def empty(self) -> bool:
        return not self.queue1

解释:

  1. push(x): 直接将元素添加到 queue1 中。
  2. pop(): 将 queue1 的所有元素(除了最后一个)移动到 queue2,然后删除并返回最后一个元素。交换 queue1queue2 以保证下次操作仍然使用 queue1 作为主要存储。
  3. top(): 过程类似 pop(),但在取出最后一个元素后,将其放回 queue2 以保留。
  4. empty(): 检查 queue1 是否为空。

这个方法确保了 poptop 操作的正确性,代价是每次 pop 需要 O(n) 的时间复杂度,而 push 仍然是 O(1)。


使用一个队列来实现,python代码如下:

from collections import deque

class MyStack:
    def __init__(self):
        self.queue = deque()

    def push(self, x: int) -> None:
        self.queue.append(x)
        for _ in range(len(self.queue) - 1):
            self.queue.append(self.queue.popleft())

    def pop(self) -> int:
        return self.queue.popleft()

    def top(self) -> int:
        return self.queue[0]

    def empty(self) -> bool:
        return not self.queue

现在的实现使用了一个队列来模拟栈的行为。在 push(x) 操作时,将新元素插入队列后,将前面的元素依次移到队列末尾,以保证 pop() 操作能直接获取栈顶元素。这样可以确保所有操作的正确性,同时 push 仍然是 O(n),poptop 维持 O(1) 时间复杂度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值