Причина, по которой очередь заполнена, когда размер N-1 заключается в том, что в этой простой реализации «r» представляет индекс следующего свободного элемента, а «f» представляет следующий элемент для извлечения. Если «f» и «r» равны, очередь пуста, поэтому очередь заполняется, если приращение «r» приведет к тому, что она будет равна «f».
В этой реализации хотя бы один элемент всегда пуст. Обычно это более эффективно, чем добавление дополнительной логики для дифференциации случая, когда «f» и «r» равны, а очередь заполнена в случае, когда она пуста.
Кстати, в большинстве процессоров мод функция намного дороже, чем использование логики, как это:
Algorithm enqueue(e):
rNext<---r + 1
if rNext = N
rNext<---0
if rNext = r then
throw a FullQueueException
r<---rNext
Q[r]<---e
Нам нужен контекст. Это не алгоритмы. Это крошечные блоки psuedo-кода. –