【问题标题】:Iplementing a stack using 2 queues使用 2 个队列实现堆栈
【发布时间】:2014-12-23 04:17:51
【问题描述】:

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

我有什么:

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)

【问题讨论】:

  • 你的代码肯定不行,因为isEmpty会因为没有size方法导致AttributeError。在打印堆栈方面,实现__str__和__repr__。

标签: python stack queue implementation


【解决方案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 之后总是更短。所以它不可能有任何东西。很明显,您的设计存在根本问题,无法修复损坏设计的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2021-07-08
    • 2014-04-21
    • 2018-08-05
    • 2010-09-09
    • 2018-06-14
    • 2015-05-15
    • 2018-05-30
    相关资源
    最近更新 更多