【问题标题】:LinkedQueue using a container of objects in Python does not work as expected在 Python 中使用对象容器的 LinkedQueue 无法按预期工作
【发布时间】:2013-12-22 16:20:27
【问题描述】:

我正在尝试使用节点(对象)的容器来实现链接队列。我的代码如下。正如您所看到的输出,出于某种原因,在出队时会跳过第二个值。很可能,某处有缺陷。我发现很难掌握这些物体到底发生了什么。请帮忙!

代码:

# Queue FIFO as a container of Nodes(objects)
class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None


class LinkedQueue(object):
    def __init__(self):
        self.front = None
        self.back = None

    def dequeue(self):
        #print self.front.__dict__, self.front.next
        if self.front:
            value = self.front.value
            self.front = self.front.next
            return value
        raise Exception('Queue Empty! Cannot dequeue')

    def enqueue(self, value):
        node = Node(value)
        if self.front:
            self.front.next = node
        else:
            self.front = node
        self.back = node  
        if not self.front is None:
            print 'BACK: ', self.back.__dict__, self.back.next
            print 'FRONT: ', self.front.__dict__, self.front.next
        return True

if __name__ == '__main__':
    queue = LinkedQueue()
    queue.enqueue(11)
    queue.enqueue(10)
    queue.enqueue(9)
    print
    print
    print queue.dequeue()
    print queue.dequeue()

输出:

BACK:  {'value': 11, 'next': None} None
FRONT:  {'value': 11, 'next': None} None
BACK:  {'value': 10, 'next': None} None
FRONT:  {'value': 11, 'next': <__main__.Node object at 0x1048cdb10>} <__main__.Node object at 0x1048cdb10>
BACK:  {'value': 9, 'next': None} None
FRONT:  {'value': 11, 'next': <__main__.Node object at 0x1048cdb50>} <__main__.Node object at 0x1048cdb50>


11
9

【问题讨论】:

    标签: python object python-2.7 data-structures queue


    【解决方案1】:

    在您的enqueue 函数中,这段代码看起来很可疑。

     if self.front:
            self.front.next = node
    

    每次调用enqueue 函数时,上述部分代码都会覆盖第二个节点。 (self.front 似乎没有任何变化)

    【讨论】:

      【解决方案2】:

      正如 harry 所写,你的 enqueue 函数有问题。

      if self.front:
          self.front.next = node
      

      应该有BACK引用,比如:

      if self.front:
          self.back.next = node
      

      因为您需要将其附加到队列的末尾。现在它应该可以工作了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        相关资源
        最近更新 更多