基于循环数组的队列插入类方法-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')