Метод класса вставки очереди на основе кругового массива - Python - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь реализовать метод вставки кольцевой очереди на основе массива, однако не могу обновить заднюю часть очереди.Вот мой код:

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

Есть предложения?

edit: вот реализация удаления:

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

1 Ответ

0 голосов
/ 17 октября 2018

Когда вы добавляете элементы путем добавления, вы расширяете свой список за пределы максимальной длины, для которой он был предварительно выделен.Затем вы обновляете 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...