题目描述
思路解析动画文字版
可以每次插入都搬运元素,但会让 push 很重。更好的做法是懒搬运。
新元素先进 in。要出队时,如果 out 为空,就把 in 全部倒过去,顺序正好反过来。
push(1):1 进入 in 栈。out 为空,不急着倒。
push(2):2 继续压入 in。此时 in 栈顶是 2。
peek 前:out 为空:要看队头,但 out 为空,触发搬运。
倒入 out:把 2、1 依次从 in 弹出压入 out。out 栈顶变成最早进入的 1。
pop():从 out 弹出 1。队列的先进先出完成。
out 不空不搬:下一次 peek 直接看 out 栈顶 2,不需要再倒。
懒搬运让 push 轻,pop/peek 需要时再付成本。
边界三连:peek、连续 pop、empty,是双栈队列的三个接口边界。
雷区实演 · out 不空不能倒:如果 out 还有队头 2,新 push 的 3 在 in。此时不能把 in 倒进 out,否则 3 会插到队头前面。
面试追问 1:in 的栈底是最早进入的元素,倒到 out 后它变成栈顶。
面试追问 2:单栈加递归可以模拟,但会用调用栈,本质仍是额外栈。
面试追问 3:元素可能在 in,也可能在 out。两个都空才队列空。
这题学完不要乱跳,下一步去 对应专题 连刷同类题;卡住时用 AI 答疑追问“为什么这一步成立”,比只背答案更稳。
参考代码
class MyQueue: def __init__(self): self.in_st = [] self.out_st = [] def push(self, x): self.in_st.append(x) def _move(self): if not self.out_st: while self.in_st: self.out_st.append(self.in_st.pop()) def pop(self): self._move() return self.out_st.pop() def peek(self): self._move() return self.out_st[-1] def empty(self): return not self.in_st and not self.out_st复杂度
- 单次最坏:O(n),out 为空时一次性搬运 n 个元素
- 均摊时间:O(1),每个元素最多从 in 到 out 搬一次
- 空间复杂度:O(n),两个栈共存队列元素
可套用的代码模板
这一步不是复读 用栈实现队列 的参考答案,而是抽出这题真正能迁移的骨架;换题时先判断状态/容器含义,再填核心分支。
# 栈题先问:遇到当前元素,要不要结算最近的历史状态?stack = []for x in 输入: while stack and 当前元素能结算栈顶: top = stack.pop() # 最近的先处理 用 top 更新答案/恢复现场 stack.append(当前状态)return 答案易错点
面试追问把动画讲成自己的话
追问为什么倒过去顺序就对了?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
下一个更大元素 I
LeetCode 496 · 简单 · 沿着 栈套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题