Создание очереди
В книге Шилдта есть такой фрагмент (последний абзац):
Обратите внимание на то, что размер очереди на единицу превышает размер, задаваемый параметром
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 шт):
Это опечатка в разных изданиях похоже, на просторах интернета ещё можно встретить реализацию с 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;
В современных изданиях упоминают только то, что индексы начинаются с нуля.
