直接回答:两个栈实现队列:栈 A 专管入队(push 直接压入 A),栈 B 专管出队——出队时若 B 非空直接弹栈顶;若 B 为空,先把 A 中所有元素逐个弹出压入 B(顺序因此翻转两次恢复先进先出),再弹 B 栈顶。反过来用两个队列实现栈:push 直接入某个队列,pop 时把该队列前 n−1 个元素依次移到另一个队列,最后剩的那个即栈顶,出队即可。
展开解析:复杂度分析是这类题的考点。两个栈做队列:push 为 O(1);pop 摊还 O(1)——每个元素一生只经历"进 A、A→B、出 B"三次操作,倒栈的开销被均摊,若 B 非空则 pop 本身就是 O(1)。两个队列做栈:push O(1),pop O(n)(也可反过来让 push O(n)、pop O(1),等价权衡)。变体追问:能否用一个栈加递归实现队列(用调用栈当第二个栈)、均摊分析与最坏情况的差别、这种"惰性迁移"思想在函数式持久队列(Okasaki 队列)中的应用。
示例:
class QueueByTwoStacks:
def __init__(self):
self.in_s, self.out_s = [], []
def push(self, x):
self.in_s.append(x)
def pop(self):
if not self.out_s:
while self.in_s:
self.out_s.append(self.in_s.pop())
return self.out_s.pop()