用两个栈实现队列:代码错误排查求助
用两个栈实现队列的代码问题排查
你的代码存在两个关键问题,导致无法正确实现队列的功能:
问题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],[],[],[]]
执行流程:
- 初始化后,
stackA和stackB均为空。 appendTail(3):stackA变为[3]。- 第一次
deleteHead:stackB为空,将stackA的3转移到stackB,弹出3返回。 - 第二次
deleteHead:stackB和stackA都为空,返回-1。 - 第三次
deleteHead:同上,返回-1。
输出与预期一致:[null,null,3,-1,-1]
内容的提问来源于stack exchange,提问作者user22007579
相关产品推荐
相关产品推荐

