使用列表在Python中堆叠数据结构

使用列表在Python中堆叠数据结构,python,stack,structure,Python,Stack,Structure,对于下面的堆栈类 class stack(list): def __init__(self): self.stack = [] self.top = -1 def isempty(self): return self.stack == [] def push(self,x): S.top = S.top + 1 return self.stack.append(x) S = stack()

对于下面的
堆栈

class stack(list):
    def __init__(self):
        self.stack = []
        self.top = -1
    def isempty(self):
        return self.stack == []
    def push(self,x):
        S.top = S.top + 1
        return self.stack.append(x)

S = stack()
S.isempty() #True
S.push(5)  #[5]
S.push(100) #[5,100]
print(S) # Returns empty stack []

为什么它不返回更新的
[5100]

您要问的问题是,您继承的是
列表
,即使您不想表现得像列表。所有这些都在造成混乱。特别是,您让
列表
超类定义对象的显示方式,并且由于您从未执行过类似于
self.append
的操作,因此只执行
self.stack.append
,这意味着它总是像空列表一样显示

修复后,对象将始终打印如下内容:

<__main__.stack at 0x11d919dd8>

您的代码中还有其他错误您仍然有一个方法,该方法将全局
S
而不是
self
,并且您将返回
列表的结果。append
,它始终返回
None
,这两个变化将共同解决您所问的具体问题。

您为什么要尝试将继承和组合结合起来?选择一个或另一个。您的代码打印空列表的原因是因为您正在变异
stack
对象的
stack
属性,而不是
stack
对象本身。我理解了这里的错误。谢谢。作为旁注:对于Python3.5和Python3.6之前的其他版本,请使用
'.format(self.stack)
。@ChristianDean为什么要使用3.6之后的版本?f字串在3.7中不会消失。对不起,这是之前的意思。@ChristianDean啊,更有意义。但我不想让OP真的复制和粘贴编写的代码,我想让他决定在打印出
堆栈
(这几乎肯定不是我正在创建的)时他想看到什么,并找出如何获得输出,这就是为什么我没有对
\urepr\uuuu
进行更多详细说明的原因。是的,我同意。然而不幸的是,有些用户盲目地复制他们找到的粘贴代码。我的便条是给他们的,真的。
class stack:
    def __init__(self):
        self.stack = []
        self.top = -1
    def __repr__(self):
        return f'<stack({self.stack})>'
    def isempty(self):
        return self.stack == []
    def push(self,x):
        S.top = S.top + 1
        return self.stack.append(x)