这是一个家庭作业问题,我不知道我的代码是对还是错。问题:如何打印堆栈(因此知道代码是否正常工作)?如果错了,我应该改变什么。
我有什么:
class stack:
def __init__(self):
self.q1 = []
self.q2 = []
def isEmpty(self):
return self.size()==0
def pop(self):
return self.q1.pop(0)
def push(self, item):
self.q2.append(item)
for i in range (len(self.q1)):
self.q2.append(self.q1.pop)
self.q2 = self.q1
print (self.q1)
s = stack()
s.push('2')
print (s)
答案 0 :(得分:1)
如何打印堆栈?
嗯,有一个显而易见的可能性,它根本不依赖于你的实现(这使它成为一个很好的单元测试):只需环顾s.pop()
直到它失败:
while True:
try:
print(s.pop())
except IndexError:
break
但是,如果你想要非破坏性地测试呢?那么,有两种选择。
首先,留在"黑匣子"方法,如果你假设push
正常工作,你可以利用堆栈应该做的不变量来打印堆栈,同时构建一个副本:
s2 = stack()
while True:
try:
value = s.pop()
except IndexError:
break
else:
print(value)
s2.push(value)
当然,这会给你一个反向堆叠,所以你想再次循环,将s2
反转回s
:
while True:
try:
value = s2.pop()
s.push(value)
except IndexError:
break
其次,您可以切换到白盒方法。 pop
做了什么?好吧,它返回q1
中的最后一个值,然后将其删除。因此,如果您反复拨打pop
,它只会以相反的顺序返回q1
中的值。所以:
for value in reversed(s.q1):
print(value)
但是如果你运行其中任何一个,你就会发现堆栈总是空的。为什么?好吧,让我们看看你的push
:
def push(self, item):
self.q2.append(item)
for i in range (len(self.q1)):
self.q2.append(self.q1.pop)
好的,第一个问题就在这里:你忘记在这里打电话 pop
了,所以你只是追加方法self.q1.pop
本身,而不是弹出一个价值并追加结果。
self.q2 = self.q1
在这里,您已完成所有这些工作,将所有值从q1
移至q2
,然后您将q2
替换为具有所有值的所有值q1
- 这是空的。
但是,即使你解决了这个问题,q1
实际上做了什么?它在开始时总是空着的。在push
之后它总是空着的。在pop
之后它总是更短。所以它可能不会有任何东西。很明显,你的设计存在根本问题,而且无法修复破碎设计的实现。