基于循环数组的队列插入类方法-Python
我正在尝试实现基于循环数组的队列的插入方法,但是我无法更新队列的后部。这是我的密码:基于循环数组的队列插入类方法-Python,python,data-structures,queue,Python,Data Structures,Queue,我正在尝试实现基于循环数组的队列的插入方法,但是我无法更新队列的后部。这是我的密码: def __init__(self, max_size): """ ------------------------------------------------------- Initializes an empty queue. Data is stored in a fixed-size list. Use: cq = Queue(max_size)
def __init__(self, max_size):
"""
-------------------------------------------------------
Initializes an empty queue. Data is stored in a fixed-size list.
Use: cq = Queue(max_size)
-------------------------------------------------------
Parameters:
max_size - maximum size of the queue (int > 0)
Returns:
a new Queue object (Queue)
-------------------------------------------------------
"""
assert max_size > 0, "Queue size must be > 0"
self._max_size = max_size
self._values = [None] * self._max_size
self._front = 0
self._rear = 0
self._count = 0
def insert(self, value):
'''-------------------------------------------------------
Adds a copy of value to the rear of the queue.
Use: cq.insert( value )
-------------------------------------------------------
Parameters:
value - a data element (?)
Returns:
None
-------------------------------------------------------'''
assert (self._count < self._max_size), 'queue is full'
self._values.append(deepcopy(value))
self._count += 1
self._rear = (self._rear - 1) % self._count
return
通过追加添加项目时,您正在将列表扩展到预先分配给的最大长度之外。然后更新
self.\u rear
就好像要将其用作插入索引,但实际上从未将其用于任何事情。我已经实现了您的代码,除了变量名之外,我只做了很小的更改(为了让我觉得更有意义),并以我认为您想要的方式使用了self.\u后方(现在是:self.\u write\u cursor)
class CQ: #Circular Queue
def __init__(self, maxsize):
self._maxsize = maxsize
self._write_cursor = 0
self._read_cursor = 0
self._len = 0
self._values = [None] * maxsize
def insert(self, item):
if self._len < self._maxsize:
self._values[self._write_cursor] = item
self._write_cursor = (self._write_cursor + 1) % self._maxsize
self._len = self._len + 1
else:
raise IndexError('can\'t push to full queue')
def remove(self):
if self._len > 0:
out = self._values[self._read_cursor]
self._read_cursor = (self._read_cursor + 1) % self._maxsize
self._len -= 1
return out
else:
raise IndexError('can\'t pop from empty queue')
类CQ:#循环队列
def ___;初始(自身,最大尺寸):
self.\u maxsize=maxsize
self.\u write\u cursor=0
self.\u read\u cursor=0
自我评价。_len=0
self.\u值=[None]*maxsize
def插件(自身,项目):
如果self.\u len0:
输出=自身值[自身读取光标]
self.\u read\u cursor=(self.\u read\u cursor+1)%self.\u maxsize
自我评价.\u len-=1
返回
其他:
raise IndexError('无法从空队列弹出')
建议:使用collections.deque
。请解释“无法更新队列后部”的含义。这是否意味着您向队列中添加的内容超过了其最大大小?您没有包含任何从队列中删除的函数;有吗?(阅读提供的内容可能会有帮助。)您还可以从中受益。@ScottMermelstein我的意思是,当向队列中添加值时,self.\u后未正确更新。我插入的值不会添加到队列一般建议的后面-请在设置后尝试打印self.\u rear
的值,以便查看它是否按预期的方式运行。然后您可以查看self.\u值[self.\u rear]
(而不是self.\u rear
)是否是您期望的值。顺便说一句,我会强烈质疑你的%self.\u count
是否达到了你的预期。@ScottMermelstein我明白你的想法了。我倾向于将“push”和“pop”与任何lifo
数据结构联系起来,通常在fifo
这样的数据结构中,我都不会费心进行更改。
class CQ: #Circular Queue
def __init__(self, maxsize):
self._maxsize = maxsize
self._write_cursor = 0
self._read_cursor = 0
self._len = 0
self._values = [None] * maxsize
def insert(self, item):
if self._len < self._maxsize:
self._values[self._write_cursor] = item
self._write_cursor = (self._write_cursor + 1) % self._maxsize
self._len = self._len + 1
else:
raise IndexError('can\'t push to full queue')
def remove(self):
if self._len > 0:
out = self._values[self._read_cursor]
self._read_cursor = (self._read_cursor + 1) % self._maxsize
self._len -= 1
return out
else:
raise IndexError('can\'t pop from empty queue')