在python中实现循环队列 - 一个级别标准

时间:2018-03-15 20:53:28

标签: python error-handling queue circular-buffer index-error

我正在尝试在python中实现循环队列,我当前的程序一直给我错误,我想知道问题并解决它。

我目前的计划是:

# circular queue

class circularQueue:
   def __init__(self, maxsize):
        self.front = 0
        self.rear = -1
        self.queue = []
        self.size = 0 # elements in the queue
        self.maxsize = maxsize #size of the array(queue)

   def isEmpty(self):
       if self.size == 0:
            return True
       else:
           return False

   def isFull(self):
       if self.size == self.maxsize:
          return True
       else:
          return False

   def enQueue(self, newItem):
       if self.size == self.maxsize:
           print('Queue Full')
       else:
           self.rear = (self.rear + 1) % self.maxsize # mod = remainder
           self.queue[self.rear] = newItem
           self.size += self.size

   def deQueue(self):
       if self.size == 0:
           print('Queue Empty')
           item = null
       else:
           item = self.queue[self.front]
           self.front = (self.front + 1) % self.maxsize
           self.size = self.size - 1

       return item

如果我尝试操作

q = circularQueue(6)
q.enQueue('k')

它说

self.queue[self.rear] = newItem
IndexError: list assignment index out of range

请帮帮我......

2 个答案:

答案 0 :(得分:0)

您正在尝试填写一个不存在的列表元素。相反,当您扩展现有列表时,必须使用append

self.queue.append(newItem)

另外,每次执行此操作时,我都不认为您想要双重 self.size - 请查看下一行:

self.size += self.size

尝试

self.size += 1

答案 1 :(得分:0)

您从queue=[]size=0rear=-1maxsize=6开始。那么,第一次调用它时enQueue会发生什么?

if self.size == self.maxsize:

不,0 != 6

self.rear = (self.rear + 1) % self.maxsize # mod = remainder

好的,self.rear = 0

self.queue[self.rear] = newItem

现在您正尝试分配给self.queue[0]。但是你创建了一个空队列;你不能分配给它的第一个元素。

这里最简单的解决方法是从self.queue = [None for _ in range(maxsize)]开始。然后队列总是有maxsize个元素。

或者,如果None可能是存储在队列中的合理值,那么如果您在初始化程序中创建一个特殊的_sentinel = object()并存储{{}},它可能会更容易调试1}}在空槽中。 (您的代码中似乎有一些特殊的_sentinel值,当您为空时返回null。如果这不是错误,那么拥有{{1}可能更有帮助那不是deQueue也不是任何可以插入的东西 - 基本上,如果你的单元测试得到_sentinel,你就知道你在某个地方把圆圈算错了。)

你可以变得更加漂亮并且长大到null,然后开始围绕圈子,但是如果你要创建大量maxsizes但大多数队列的队列你只需要优化永远不要靠近maxsize。所以请保持简单。

最后:

_sentinel

什么?将maxsize加倍可能对无界队列有意义,但这是一个有界队列。将正在使用的self.size += self.size 加倍是没有意义的。你可能只想在这里maxsize