使用Python中的对象容器的LinkedQueue无法按预期工作

时间:2013-12-22 16:20:28

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

我正在尝试使用节点容器(对象)实现链接的队列。我的代码如下。正如您可以看到的那样,当出于某种原因出队时,第二个值将被跳过。可能在某处存在缺陷。我发现很难掌握对象究竟发生了什么。请帮忙!

代码:

# 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

2 个答案:

答案 0 :(得分:1)

enqueue函数中,此段代码看起来很可疑。

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

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

答案 1 :(得分:1)

正如哈里所写,你的入队功能存在问题。

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

应该有BACK引用,例如:

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

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