2014-03-31 241 views
1

我想在Python中创建一个循环队列,以便当数组中的最后一个元素到达指向头部时。我正在研究排队方法,并且遇到一些问题。我想要一个大小为4的数组,并且我能够将值排入第四个点,但是当它执行elif语句时,我会收到此错误。循环队列Python

类型错误:不支持的操作数类型(一个或多个)为+: '节点' 和 'INT'

任何想法?

class Node(object): 
    def __init__(self, item = None): 
     self.item = [None] * 4 
     self.next = None 
     self.previous = None 

class CircularQueue(object): 
    def __init__(self): 
     self.length = 0 
     self.head = None 
     self.tail = None 
    def enqueue(self, x): 
     newNode = Node(x) 
     newNode.next = None 
     if self.head == None: 
      self.head = newNode 
      self.tail = newNode 
     elif self.length < 4: 
      self.tail.next = newNode 
      newNode.previous = self.tail 
      self.tail = newNode 
     else: 
      self.tail = (self.tail + 1) % 4 
     self.length += 1 
    def dequeue(self): 
     if self.count == 0: 
      print ("The Queue is empty!") 
     self.count -= 1 
     return self.item.pop() 
    def size(self): 
     return self.length 
+1

看起来像是一个很好的问题http://codereview.stackexchange.com/ – IceArdor

+1

已经有[deque](https://docs.python.org/2/library/collections.html#collections.deque)在收藏。 – wim

+0

您正在使用'self.count'和'self.length'实例变量。始终如一。 – IceArdor

回答

8

如果你没有这个实现自己,你可以使用标准库deque

from collections import deque 

circular_queue = deque([1,2], maxlen=4) 
circular_queue.append(3) 
circular_queue.extend([4]) 

# at this point you have [1,2,3,4] 
print(circular_queue.pop()) # [1,2,3] --> 4 

# key step. effectively rotate the pointer 
circular_queue.rotate(-1) # negative to the left. positive to the right 

# at this point you have [2,3,1] 
print(circular_queue.pop()) # [2,3] --> 1 
1

你的问题是在这里:

self.tail + 1 

但在此之前,你发起的尾巴成为节点:

self.tail = newNode 

因此错误。

+0

为什么这很重要?我希望它一旦达到4就开始回绕。这段代码甚至不应该在else语句中执行一次。 – user2483196

+0

那么,你的“旧”'self.tail'是一个节点(因为它被设置为'newNode'),它不是某种索引。一旦达到4,就必须将尾巴连接到头部。 – fredtantini

1

我会试着指出你在正确的方向,因为它看起来像你正试图学习如何实现一个循环队列,也许学习同时编程。错误消息试图告诉你变量self.tail是一个对象,它不能被添加到一个数字(整数)。

的代码行:

self.tail = (self.tail + 1) % 4 

是导致错误的问题。然而,在尝试修复这条线之前,有一些核心概念需要理解。例如,您不必在Node对象中创建数组。 Self.item可以设置为任何内容。似乎它可能会混淆循环队列的目的。例如,而不是

self.item = [None] * 4 

你可以使用

self.item = item 

那么当你创建你可以使用类似的Node对象:

mycircularqueue = CircularQueue() 
mycircularqueue.enqueue('cat') 
mycircularqueue.enqueue('dog') 
mycircularqueue.enqueue('mouse') 

三个项目添加到您的队列。

+0

我使用4的原因是制作一个固定的尺寸。一旦达到4号,我怎样才能让尾巴回到头部?这就是self.tail =(self.tail + 1)%4的要点。另外,我可以创建一个队列,但是当它“满”时我不能指向头部。 – user2483196

1

如果你只是想让尾巴到达头部。

list = [1,2,3] 
list = list + list[0:1] 

您将获得:

[1,2,3,1] 

也许这是最简单的方式。