我正在尝试在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
请帮帮我......
答案 0 :(得分:0)
您正在尝试填写一个不存在的列表元素。相反,当您扩展现有列表时,必须使用append
:
self.queue.append(newItem)
另外,每次执行此操作时,我都不认为您想要双重 self.size - 请查看下一行:
self.size += self.size
尝试
self.size += 1
答案 1 :(得分:0)
您从queue=[]
,size=0
,rear=-1
和maxsize=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
。