2014-10-27 175 views
0

这是一个家庭作业问题,我不知道我的代码是对还是错。问题:如何打印堆栈(因此知道代码是否工作)?如果错了,我应该改变什么。使用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) 
+1

你的代码肯定不能工作,因为由于没有'size'方法,'isEmpty'会导致'AttributeError'。在打印堆栈方面,实现'__str__'和'__repr__'。 – jonrsharpe 2014-10-27 21:17:56

回答

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) 

当然,让你倒栈,所以你会再次要循环的是,倒车s2s

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 

在这里,你所做的这一切工作,所有的值从移动到q1q2,然后更换q2哪位有你所有的价值观与q1哪位是空的。

但是,即使你修好了,q1究竟在做什么呢?开始时它总是空的。在push之后总是空的。在pop之后它总是更短。所以它不可能有任何东西。很明显,您的设计存在根本性问题,无法解决破损设计的实施问题。