【问题标题】:Circular Array-Based Queue Insert Class Method - Python基于循环数组的队列插入类方法 - Python
【发布时间】:2018-10-16 19:40:20
【问题描述】:

我正在尝试实现基于循环数组的队列的插入方法,但是无法更新队列的尾部。这是我的代码:

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

有什么建议吗?

编辑: 这是删除实现:

def remove(self):

        '''-------------------------------------------------------
        Removes and returns value from the queue.
        Use: v = cq.remove()
        -------------------------------------------------------
        Returns:
            value - the value at the front of the queue - the value is
                removed from the queue (?)
        -------------------------------------------------------'''
        assert (self._count > 0), 'Cannot remove from an empty queue'
        value = self._values[self._front]
        self._front = (self._front + 1) % self._count
        self._count += -1
        return value

【问题讨论】:

  • 建议:使用collections.deque
  • 请解释您所说的“无法更新队列的尾部”是什么意思。这是否意味着您向队列中添加的内容超过了它的 max_size?您没有包含任何从队列中删除的功能;你是否有一个? (阅读提供minimal reproducible example 可能会有所帮助。)您还可以从tour 和阅读How to Ask 中受益。
  • @ScottMermelstein 我的意思是当一个值被添加到队列中时, self._rear 没有正确更新。我插入的值没有添加到队列的尾部
  • 一般建议 - 在设置后尝试打印 self._rear 的值,以便查看其行为是否符合您的预期。然后您可以查看self._values[self._rear] (not self._rear) 是否是您期望的值。顺便说一句,我会强烈质疑您的 % self._count 是否符合您的预期。

标签: python data-structures queue


【解决方案1】:

当您通过追加添加项目时,您将列表扩展至超出您预先分配的最大长度。然后您更新self._rear,就好像您打算将它用作插入索引一样,但实际上从未将它用于任何事情。我已经实现了您的代码,除了变量名称(为了对我更有意义)之外,只进行了非常小的更改,并以我相信您的意图使用self._rear (now: self._write_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')

【讨论】:

  • @ScottMermelstein 我知道你来自哪里。我倾向于将“push”和“pop”与任何lifo 数据结构相关联,并且通常不会在fifo 像这里那样进行更改。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多