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

用两个栈实现队列:代码错误排查求助

用两个栈实现队列的代码问题排查

你的代码存在两个关键问题,导致无法正确实现队列的功能:

问题1:栈空判断逻辑错误

Python中判断列表(栈)是否为空,不能用self.__stackB == 0——列表和整数0永远不会相等,这个判断条件永远为False。正确的判断方式是使用not self.__stackB(推荐)或者len(self.__stackB) == 0。

问题2:栈元素转移不彻底

当栈B为空但栈A不为空时,你只将栈A的一个元素转移到栈B就直接弹出,这会导致队列的队头元素没有被正确映射到栈B的栈顶。比如栈A中有[1,2,3],只转移一个元素后栈B是[3],弹出的是3,但队列的队头应该是1。正确的做法是将栈A的所有元素依次弹出并压入栈B,这样栈B的栈顶就是队列的队头。


修正后的代码

class CQueue(object):

    def __init__(self) -> None:
        self.__stackA = [] 
        self.__stackB = [] 

    def appendTail(self, val: int) -> None:
        self.__stackA.append(val)
    
    def deleteHead(self) -> int:
        # 栈B不为空,直接弹出栈顶(对应队列队头)
        if self.__stackB:
            return self.__stackB.pop()
        # 栈B为空,栈A也为空,返回-1
        if not self.__stackA:
            return -1
        # 将栈A所有元素转移到栈B,完成顺序反转
        while self.__stackA:
            self.__stackB.append(self.__stackA.pop())
        # 弹出栈B栈顶,即队列队头
        return self.__stackB.pop()

验证示例输入

输入:

["CQueue","appendTail","deleteHead","deleteHead","deleteHead"] [[],[3],[],[],[]]

执行流程:

  1. 初始化后,stackA和stackB均为空。
  2. appendTail(3):stackA变为[3]。
  3. 第一次deleteHead:stackB为空,将stackA的3转移到stackB,弹出3返回。
  4. 第二次deleteHead:stackB和stackA都为空,返回-1。
  5. 第三次deleteHead:同上,返回-1。

输出与预期一致:[null,null,3,-1,-1]

内容的提问来源于stack exchange,提问作者user22007579

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:53:11