副标题 / 摘要
只有队列(FIFO)时,也能实现栈(LIFO)。本文展示单队列旋转法,并分析复杂度与边界。
目标读者
- 刷题与面试准备的开发者
- 需要理解数据结构转换的人
- 初中级算法学习者
背景 / 动机
栈的后进先出与队列的先进先出相反。
“旋转队列”可以把最新元素移动到队头,从而模拟栈顶。
核心概念
- 队列(FIFO):先进先出
- 栈(LIFO):后进先出
- 队列旋转:把新元素转到队首
实践指南 / 步骤
- 入栈:将元素入队
- 旋转队列:把队首依次出队再入队,直到新元素位于队首
- 出栈:直接出队
- 取栈顶:查看队首
可运行示例
from collections import deque
class MyStack:
def __init__(self):
self.q = deque()
def push(self, x: int) -> None:
self.q.append(x)
for _ in range(len(self.q) - 1):
self.q.append(self.q.popleft())
def pop(self) -> int:
return self.q.popleft()
def top(self) -> int:
return self.q[0]
def empty(self) -> bool:
return not self.q
if __name__ == "__main__":
s = MyStack()
s.push(1)
s.push(2)
print(s.top())
print(s.pop())
print(s.empty())
解释与原理
每次 push 后旋转队列,使新元素位于队首。
这样 pop 就相当于弹出“栈顶”。
常见问题与注意事项
复杂度如何?
push 为 O(n),pop 为 O(1)。能否用两个队列?
可以,但逻辑更复杂,不一定更快。适合高频 push 的场景吗?
不适合,push 成本较高。
最佳实践与建议
- 如果 push 频繁,考虑双队列优化
- 对空栈操作做好异常处理
- 明确时间复杂度在文档中说明
小结 / 结论
单队列旋转法简单直观,但 push 成本较高。
它是理解 FIFO/LIFO 互换的经典练习。
参考与延伸阅读
- LeetCode 225
- 数据结构教材章节
元信息
- 阅读时长:6~8 分钟
- 标签:栈、队列、旋转
- SEO 关键词:用队列实现栈, 单队列
- 元描述:解释用队列实现栈的单队列方法。
行动号召(CTA)
对比双队列与单队列的实现,写一份复杂度对比表。