You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用两个队列实现栈:测试用例失败,请求排查代码错误

两个队列实现栈的push/pop函数错误分析

你用两个队列实现栈的思路是对的——同一时刻仅一个队列非空,新元素放入空队列后将另一队列元素移过来,保证pop时能取到最新元素。但代码的核心错误在于push函数中的三个条件使用了独立的if而非elif,导致多个分支被触发,破坏了队列的状态。

错误过程分析

  • 第一次执行push(1)时:
    1. 第一个if(两个队列都空)成立,将1放入queue_1。
    2. 此时queue_1非空、queue_2空,第三个if的条件也成立,于是又将1放入queue_2,再把queue_1中的1移到queue_2。最终queue_2里有两个1,queue_1为空,直接违反了“仅一个队列非空”的设计原则。
  • 执行push(2)时:
    1. 第二个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:31:12