python 算法问题-堆栈和队列-简单

n9vozmp4  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(183)

这里有一个简单的算法问题,关于堆栈和队列,谁能帮我看看我的代码有什么问题?
实现一个有两个堆栈的队列。队列的声明如下。实现它的两个函数appendTail和deleteHead,这两个函数分别执行在队列末尾插入一个整数和在队列头部删除一个整数的功能。(如果队列中没有元素,则deleteHead操作返回-1)text

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:
        if self.__stackB == 0:
            if self.__stackA == 0:
                return -1
            else:
                self.__stackB.append(self.__stackA.pop())
                return self.__stackB.pop()
        else:
            return self.__stackB.pop()

代码在上面。我试着把情况分成:1)B = 0,A = 0(返回-1); 2)B = 0,A!= 0(将元素从A转移到B),以及3)B!= 0(直接弹出前面的元素)正确的输入和输出应该是:
输入:["CQueue","appendTail","deleteHead","deleteHead","deleteHead"] [[],[3],[],[],[]]输出:[null,null,3,-1,-1]
感谢您关注这个问题,如果您能提供帮助,我们将不胜感激。

ikfrs5lh

ikfrs5lh1#

有两个问题:

  • 将列表与0进行比较并不是真正有用的,因为这永远不会是真的。要测试列表是否为空,可以使用not self.__stackAlen(self.__stackA) == 0,或两者的组合。
  • 当栈B为空,但栈A有值时,你不应该从栈A的顶部转移一个元素到栈B,而是应该转移它的所有元素,这样在栈A的 * 底部 * 的元素就成为栈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:
        if not self.__stackB:  # don't compare with 0
            if not self.__stackA:
                return -1
            else:
                while self.__stackA:  # Transfer ALL elements
                    self.__stackB.append(self.__stackA.pop())
                return self.__stackB.pop()
        else:
            return self.__stackB.pop()

你也可以避免一些重复的代码:

def deleteHead(self) -> int:
        if not self.__stackB:
            while self.__stackA:
                self.__stackB.append(self.__stackA.pop())
            if not self.__stackB:  # Still nothing there...
                return -1
        return self.__stackB.pop()  # Common action when there is data

**备注:**我希望堆栈是用一个特定的类创建的,因为当你将它们创建为标准列表时,你没有理由用它们做非堆栈的事情,比如反转它们等,这显然是不允许的。

相关问题