灵感来源
- 保持更新,努力学习
- python脚本学习
用队列实现栈
解题思路
要用队列实现栈,关键在于如何调整队列的特性(FIFO)来满足栈的要求(LIFO)。我们可以使用两种方法:
- 单队列法:每次入栈时,将元素添加到队列尾部,然后将前面的所有元素依次出队再入队,使得新元素位于队列头部。
- 双队列法:入栈时将元素添加到非空队列,出栈时将非空队列的前 n-1 个元素移到另一个队列,剩下的最后一个元素即为栈顶元素。
下面我将使用单队列法实现,因为它更简洁,空间复杂度更低。
from collections import deque
class MyStack:
def __init__(self):
# 使用deque作为队列实现
self.queue = deque()
def push(self, x: int) -> None:
# 记录当前队列长度
size = len(self.queue)
# 添加新元素到队列尾部
self.queue.append(x)
# 将前面的size个元素依次出队再入队
for _ in range(size):
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 len(self.queue) == 0
逐行解释
from collections import deque
class MyStack:
def __init__(self):
# 初始化一个双端队列作为底层数据结构
self.queue = deque()
def push(self, x: int) -> None:
# 获取当前队列的长度,即已有元素数量
size = len(self.queue)
# 将新元素添加到队列尾部
self.queue.append(x)
# 通过循环将之前的所有元素依次移到新元素后面
# 确保新元素位于队列头部(栈顶)
for _ in range(size):
# 移除队列头部元素
front = self.queue.popleft()
# 将移除的元素添加到队列尾部
self.queue.append(front)
def pop(self) -> int:
# 直接弹出队列头部元素,即栈顶元素
return self.queue.popleft()
def top(self) -> int:
# 返回队列头部元素的值,不移除
return self.queue[0]
def empty(self) -> bool:
# 判断队列是否为空,空则栈空
return len(self.queue) == 0