使用2个队列实现堆栈

时间:2014-10-27 21:06:02

标签: python stack queue implementation

这是一个家庭作业问题,我不知道我的代码是对还是错。问题:如何打印堆栈(因此知道代码是否正常工作)?如果错了,我应该改变什么。

我有什么:

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 个答案:

答案 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之后它总是更短。所以它可能不会有任何东西。很明显,你的设计存在根本问题,而且无法修复破碎设计的实现。