2017-09-06 75 views
0

我試圖理解這段代碼是如何工作的,而且我已經遇到了一些困惑,關於如何思考它,特別是如何將所有東西連接在一起。這個鏈接的隊列代碼是如何工作的? - Python

以下是我正在考慮呢:

當隊列(Q)進行初始化,我們有Q = [self._head =無,self._tail =無,大小= 0(不Python代碼 - 只是一種組織數據屬性的直觀方式),那麼當第一個元素入隊時,我們創建一個節點N1 =(e1,None),它被分配給self._head和self._tail,並且Q = [(e1,None ),(e1,None),1]。當第二個元素入隊到隊列時,我們創建第二個節點N2 =(e2,None),我們有self._tail._next = newest,它將Q更新爲Q = [(e1,None),(e1 ,N2),1]。然後,代碼具有self._tail = newest,然後將Q更新爲Q = [(e1,None),(e2,None),2]。

看起來好像它並沒有實際連接任何東西。在我對這段代碼的理解中,我錯過了什麼?

class LinkedQueue: 

    class _Node: 

     __slots__='__element', '__next' 

     def __init__(self, element, next): 
      self._element = element 
      self._next = next 

    def __init__(self): 
     self._head = None 
     self._tail = None 
     self._size = 0 

    def dequeue(self): 
     if self.is_empty(): 
      raise Exception('Queue is empty') 
     answer = self._head._element 
     self._head = self._head._next 
     self._size -= 1 
     if self.is_empty(): 
      self._tail = None 
     return answer 

    def enqueue(self, e): 
     newest = self._Node(e, None) 
     if self.is_empty(): 
      self._head = newest 
     else: 
      self._tail._next = newest 
     self._tail = newest 
     self._size += 1 

回答

1

一個隊列至少有兩點:一個是頭部,一個是尾部。這允許您按照添加順序遍歷節點,並將新節點添加到隊列末尾。

Head -> <- Tail 

添加1到隊列:

Head -> 1 <- Tail 

添加2到隊列:

Head -> 1 
      2 <- Tail 

添加3到隊列,因爲我們可以想像一個空隊列:

Head -> 1 
      2 
      3 <- Tail 

將元素出隊意味着將Head移動到下一個元素並返回舊值。

  1 <- first_element 

    Head -> 2 
      3 <- Tail 

我有一個fairly basic Queue implementation如果你想看看。