2017-09-20 8 views
0

En tant que programmeur python relativement nouveau, j'ai récemment tenté d'émuler enqueue et dequeue en utilisant une classe et une sous-classe. À l'heure actuelle, mon code lu plus une tentative d'exécution lit comme suit:Emulation de Python Enqueue et Dequeue en utilisant une sous-classe

class queue: 
    class node: 
     def __init__(self, value, nextNode): 
      self.value = value 
      self.nextNode = nextNode 

    def __init__(self): 
     self.top = None 
     self.last = None 
     self.size = 0 

    def __len__(self): 
     return self.size 

    def enqueue(self, value): 
     #This creates an extra node with "value" and inserts at the top 
     newNode=queue.node(value,None) 
     if self.size ==0: 
      self.top=newNode 
      self.last=self.top 
      self.size+=1 
     else: 
      self.last.nextNode=newNode 
      self.last=newNode 
      self.size+=1  

    def dequeue(self): 
     #This returns self.top.value and at the same time deletes the top 
     node. 
     if self.size ==0: 
      return "error: dequeue from an empty queue" 
     elif self.size == 1: 
      val=self.top.value 
      nxt=self.top.nextNode 
      self.top=None 
      self.last=None 
     else: 
      val=self.top.value 
      nxt=self.top.nextNode 
      self.top=nxt 
     return val 

q = queue() 
q.enqueue(1) 
q.enqueue(2) 
q.enqueue(3) 
q.enqueue(4) 
x=q.dequeue() 
output = [] 
while len(q)>0: 
    x = q.dequeue() 
    output.append(x) 
print(output) 
#This should show [2, 3, 4] 

D'après ce que je peux comprendre, renvoie une valeur actuellement je recevoir ma question principale:

AttributeError: objet « NoneType » n'a pas Attribut 'value'

Lorsque j'essaie de fonctionner. Si quelqu'un pouvait clarifier la question, ce serait grandement apprécié.

Répondre

0

Vous devez réduire self.size lorsque vous supprimez des données. C'est toujours 4 depuis l'exécution de votre programme via pdb.

def dequeue(self): 
    if self.size ==0: 
     return "error: dequeue from an empty queue" 
    elif self.size == 1: 
     val=self.top.value 
     nxt=self.top.nextNode 
     self.top=None 
     self.last=None 
     self.size -= 1 
    else: 
     val=self.top.value 
     next=self.top.nextNode 
     self.top=next 
     self.size 
     self.size -= 1 
    return val 
+0

Wow, je ne peux pas croire que j'ai raté ça. J'ai jeté un self.size- = 1 dans les déclarations de file d'attente et bien sûr cela fonctionne comme un charme! Merci d'avoir fait remarquer cela! –

+0

Pas de problème du tout Michael. Beau travail avec tout le reste cependant. Je viens de tomber en deux lignes et ça a marché comme un charme de mon côté. – Kyle