2013-12-22 43 views
0

我正在嘗試使用容器的節點(對象)實現鏈接隊列。我的代碼如下。正如你所看到的輸出,第二個值在出於某種原因出隊時被跳過。可能在某處存在缺陷。我發現很難把握,至於物體究竟發生了什麼。請幫忙!在Python中使用對象容器的LinkedQueue不能按預期方式工作

代碼:

# 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 

回答

1

在你enqueue功能,這個代碼段看起來很可疑。

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

每次enqueue函數被調用,代碼的上述部分將覆蓋第二個節點。 (self.front似乎沒有任何改變)

1

正如哈利寫道,你的入隊函數有一個問題。

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

應該有反向引用,如:

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

因爲你需要把它添加到隊列的末尾。現在它應該工作。

相關問題