【发布时间】:2021-11-27 02:55:21
【问题描述】:
我已经创建了 Node 和 Stack 类,但我不知道如何在 Stack 类中显示 repr 以便能够打印当前在堆栈中的所有项目?我一直在尝试连接节点,但我不确定 Stack() 不允许像列表那样迭代是怎么回事?
堆栈正常工作,我只是不知道如何显示它的内容?
这是我的代码:
class Stack:
class Node:
def __init__(self, elem, next):
self.elem = elem
self.next = next
def __repr__(self):
return str(self.elem)
def __init__(self):
self._stack = None
self._size = 0
def __repr__(self):
# *Not sure how to implement this properly*
s = ''
for i in range(self._size):
last = self._stack.elem
s += (str(last))+ ', '
self._stack.elem = self._stack.next
return
def push(self, elem):
if self._stack == None:
self._stack = self.Node(elem, None)
self._size += 1
else:
self._stack = self.Node(elem, self._stack)
self._size += 1
def pop(self):
if self._stack == None:
raise Exception ('This Stack is empty!')
else:
last = self._stack.elem
self._stack = self._stack.next
self._size -= 1
return last
def top(self):
return self._stack.elem
def isEmpty(self):
return self._size == 0
例子:
s= Stack()
s.push(4)
s.push(9)
s.push("joe")
s
joe, 9, 9,
提前谢谢你。
【问题讨论】:
-
我要注意的是,通常情况下,Python 类实例的
repr是您可以粘贴回解释器以重新创建等效实例的东西。如果你想生成一个规范的repr,你应该允许你的类通过传递一个可迭代的对象来构造,而不仅仅是创建一个空的并逐项填充。同样,您的Noderepr几乎肯定应该使用包含项目的repr,而不是str形式(省略"Node()"可以,因为Node是一个实现细节)。 -
您不应该在循环中使用实例变量,它们应该只是局部变量。实例变量用于对象的永久状态。
-
我不认为调用
_repr_应该改变堆栈。 -
你需要把
return改成return s。 -
在您当前的
__repr__实现中,您实际上修改了self._stack.elem- 这是您不想要的副作用。此外,您不应该使用像next这样的名称,因为它们会影响 Python 内置的next;此外,虽然您可以将堆栈实现为链表,但它并没有真正的好处,因此您可能应该只使用列表作为内部存储,甚至只使用现有的 Python 类来存储这种类型的功能。
标签: python python-3.x singly-linked-list