Skip to main content

225.用队列实现栈

标签: stack, queue, design

难度: Easy

通过率: 65.92%

原题链接: https://leetcode.com/problems/implement-stack-using-queues/description/

题目描述

实现一个后入先出(LIFO)的栈,仅使用两个队列。实现的栈应该支持所有标准栈操作(push、top、pop、empty)。

解题思路

我们可以通过两个队列来实现一个栈,以模拟栈的后入先出特性。关键在于如何用队列的操作来实现栈的 pushpoptopempty 操作。实现思路如下:

  1. push(x): 直接将元素添加到主队列 q1 中。这是队列的基本操作。

  2. pop(): 为了实现“栈顶元素出栈”,我们需要将队列中的所有元素除最后一个外全部移到辅助队列 q2,然后弹出最后一个元素,之后 q1q2 交换即可。

  3. top(): 实现方式与 pop() 类似,但需要将最后一个元素留在 q1 中,并在 q2 中加入该元素。

  4. empty(): 只需检查主队列 q1 是否为空。

可以这样用两个队列模拟栈操作:每次需要弹出和查看栈顶元素时,只需要将队列中的元素调换到另一个队列中,实际上保持了队列先进先出的特点,但实现了栈的后入先出操作。

代码实现

from collections import deque

class MyStack:
def __init__(self):
# 使用两个队列
self.q1 = deque()
self.q2 = deque()

# 压入元素x到栈顶
def push(self, x: int) -> None:
self.q1.append(x)

# 移除并返回栈顶元素
def pop(self) -> int:
while len(self.q1) > 1:
# 将q1的前n-1个元素移动到q2
self.q2.append(self.q1.popleft())
# 弹出q1中最后一个元素,同时这也是栈顶元素
res = self.q1.popleft()
# 交换q1和q2
self.q1, self.q2 = self.q2, self.q1
return res

# 返回栈顶元素
def top(self) -> int:
while len(self.q1) > 1:
self.q2.append(self.q1.popleft())
# 先存储q1中最后一个元素再移动
res = self.q1.popleft()
self.q2.append(res)
# 交换q1和q2
self.q1, self.q2 = self.q2, self.q1
return res

# 返回栈是否为空
def empty(self) -> bool:
return not self.q1

复杂度分析

时间复杂度:

  • push(x) 操作的时间复杂度为 O(1)O(1)
  • pop()top() 操作的时间复杂度为 O(n)O(n),因为我们需要将队列的所有元素移动到另一个队列。
  • empty() 操作的时间复杂度为 O(1)O(1)

空间复杂度:

  • 总的空间复杂度为 O(n)O(n),其中 nn 是栈中元素的数量,因为我们使用两个队列来存储栈中的元素。