使用2个队列实现堆栈
问题描述:
这是一个家庭作业问题,我不知道我的代码是对还是错。问题:如何打印堆栈(因此知道代码是否工作)?如果错了,我应该改变什么。使用2个队列实现堆栈
我有什么:
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)
答
我怎样才能打印堆栈?
嗯,有一个明显的可能性,这完全不依赖于你的实现(这使它成为一个伟大的单元测试):随便看看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)
OK,第一个问题就在这里:你忘了呼叫pop
在这里,所以你只是附加的方法self.q1.pop
本身,而不是弹出一个值和附加结果。
self.q2 = self.q1
在这里,你所做的这一切工作,所有的值从移动到q1
q2
,然后更换q2
哪位有你所有的价值观与q1
哪位是空的。
但是,即使你修好了,q1
究竟在做什么呢?开始时它总是空的。在push
之后总是空的。在pop
之后它总是更短。所以它不可能有任何东西。很明显,您的设计存在根本性问题,无法解决破损设计的实施问题。
你的代码肯定不能工作,因为由于没有'size'方法,'isEmpty'会导致'AttributeError'。在打印堆栈方面,实现'__str__'和'__repr__'。 – jonrsharpe 2014-10-27 21:17:56