не могу понять уравнение индекса очереди

#data-structures #queue

Вопрос:

Предположим, у нас есть круговая очередь. Более того, давайте также скажем, что он основан на массиве. У нас был бы передний индекс, задний индекс и размер. Однако, когда дается следующее уравнение для поиска заднего индекса, я довольно запутываюсь: rear_index = (rear_index 1) % arraySize; Может ли кто-нибудь, пожалуйста, объяснить мне, что именно происходит? Как это может работать для постановки в очередь?

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Читайте об операции по модулю. Оператор % возвращает остаток после деления. Например, 10% 7 == 3 (7 делится на 10 один раз, осталось 3), 10 % 3 == 1 (3 делится на 10 3-кратный остаток 1) и т. Д.

Если size == 10 и rear_index == 9 (последний элемент в массиве), rear_index = (rear_index 1) % 10; присваивает rear_index = (9 1) % 10; // == 0 . rear_index имеет «петлю» от 9 до 0, следующее увеличение будет 1, затем 2, затем…9,0,1,2…

При реализации очереди с использованием циклического буфера (часто также называемого «кольцевым буфером») таким образом увеличиваются как начальный, так и конечный индексы, и код применяет правила, аналогичные следующим (комментарий из моего собственного старого кода)…

 /* _head (presumably front_index) => index of oldest entry (next to be returned)
 * _tail (presumably rear_index) => index of next entry to be inserted
 * _head == _tail amp;amp; queue[tail] != null => queue full
 * _head == _tail amp;amp; queue[tail] == null => queue empty