用两个队列实现栈:测试用例失败,请求排查代码错误
两个队列实现栈的push/pop函数错误分析
你用两个队列实现栈的思路是对的——同一时刻仅一个队列非空,新元素放入空队列后将另一队列元素移过来,保证pop时能取到最新元素。但代码的核心错误在于push函数中的三个条件使用了独立的if而非elif,导致多个分支被触发,破坏了队列的状态。
错误过程分析
- 第一次执行
push(1)时:- 第一个
if(两个队列都空)成立,将1放入queue_1。 - 此时
queue_1非空、queue_2空,第三个if的条件也成立,于是又将1放入queue_2,再把queue_1中的1移到queue_2。最终queue_2里有两个1,queue_1为空,直接违反了“仅一个队列非空”的设计原则。
- 第一个
- 执行
push(2)时:- 第二个
if(queue_1空、queue_2非空)成立,将2放入queue_1,再把queue_2中的两个1移到queue_1。此时queue_1的元素顺序是2、1、1。
- 第二个
- 两次pop操作:第一次取出2(符合预期),第二次取出1,但队列里还剩一个1,后续pop会继续取出1,这会导致栈空判断等场景出现错误。
修正后的代码
将push函数中的后两个if改为elif,确保同一时刻只有一个分支被执行:
from queue import Queue def push(x): global queue_1 global queue_2 if queue_1.empty() and queue_2.empty(): queue_1.put(x) elif queue_1.empty() and not queue_2.empty(): queue_1.put(x) while not queue_2.empty(): y = queue_2.get() queue_1.put(y) elif not queue_1.empty() and queue_2.empty(): queue_2.put(x) while not queue_1.empty(): y = queue_1.get() queue_2.put(y) def pop(): global queue_1 global queue_2 if queue_1.empty() and queue_2.empty(): return -1 if queue_1.empty(): x = queue_2.get() else: x = queue_1.get() return x
测试验证
修正后执行你的测试用例,所有断言都会通过:
queue_1 = Queue() queue_2 = Queue() push(1) push(2) assert pop() == 2 assert pop() == 1 assert pop() == -1 # 栈空时返回-1,符合预期
内容的提问来源于stack exchange,提问作者Priya Prerana
相关产品推荐
相关产品推荐

