2017-09-06 32 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如果你想看看。