Создание очереди

В книге Шилдта есть такой фрагмент (последний абзац):

 последний абзац

Обратите внимание на то, что размер очереди на единицу превышает размер, задаваемый параметром size.

Почему размер очереди больше параметра size (откуда мы это взяли) и почему один элемент массива остается неиспользованным? Если у нас размер очереди превышает размер size, а в книге сказано, что размер массива должен быть больше размера очереди, то почему размер массива указывается size, что за противоречие?

Полный код:

class Queue{
    char q[];
    int putloc, getloc;

    Queue(int size){
        q=new char[size];
        putloc=getloc=0;
    }
    void put(char ch){
        if(putloc==q.length){
            System.out.println("-Очередь заполнена");
            return;
        }
        q[putloc++]=ch;
    }
    char get(){
        if (getloc==putloc){
            System.out.println("-Очередь пуста");
            return (char) 0;
        }
        return q[getloc++];
    }
}

public class Main {
    public static void main(String[] args)
            throws java.io.IOException {
        Queue bigQ = new Queue(25);
        Queue smallQ = new Queue(4);
        char ch;
        int i;
        System.out.println("Использование очереди bigQ для хранения алфавита");
        for (i = 0; i < 26; i++)
            bigQ.put((char) ('A' + i));
        System.out.print("Содержимое очереди bigQ: ");
        for (i = 0; i < 26; i++) {
            ch = bigQ.get();
            if (ch != (char) 0)
                System.out.print(ch);
        }
        System.out.println("\n");
        System.out.println("Использование очереди smallQ для генерации ошибок");
        for (i = 0; i < 5; i++) {
            System.out.print("Попытка сохранения " + (char) ('Z' - i));
            smallQ.put((char) ('Z' - i));
            System.out.println();
        }
        System.out.println();
        System.out.print("Содержимое очереди smallQ: ");
        for (i = 0; i < 5; i++) {
            ch = smallQ.get();
            if (ch != (char) 0)
                System.out.print(ch);
        }
    }
}

Ответы (1 шт):

Автор решения: Komdosh

Это опечатка в разных изданиях похоже, на просторах интернета ещё можно встретить реализацию с size+1

Она была такой:

Queue(int size){
    q = new char[size+1];
    putloc = getloc = 0;
}

void put(char ch) {
    if (putloc == q.length - 1){ //
       System.out.println(" -Очередь заполнена");
       return;
    }
    putloc++; // инкремент индекса до того, как кладём значение в очередь 
    q[putloc] = ch; 
    // что соответствует q[++putloc]=ch
 }

Здесь надо обратить внимание на то, что в современных изданиях в очередь сначала кладётся элемент и только затем инкрементируется индекс

q[putloc++] = ch;

эквивалентно записи

q[putloc] = ch;
putloc += 1;

В современных изданиях упоминают только то, что индексы начинаются с нуля.

→ Ссылка