evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему в очереди не используется нулевой индекс в массиве?

Есть вот такой вот код реализующий очередь:
public class Queue {
    private char q[];
    private int putLoc, getLoc;

    public Queue(int size) {
        q = new char[size + 1]; // Зачем создавать массив на единицу больше?
        putLoc = getLoc = 0;
    }

    public Queue(Queue obj) {
        putLoc = obj.putLoc;
        getLoc = obj.getLoc;
        q = new char[obj.q.length];

        for (int i = getLoc + 1; i <= putLoc; i++) { // Почему не используется нулевой индекс в массиве?
            q[i] = obj.q[i];
        }
    }

    public Queue(char a[]) {
        putLoc = 0;
        getLoc = 0;
        q = new char[a.length + 1];

        for (int i = 0; i < a.length; i++) {
            put(a[i]);
        }
    }

    public void put(char ch) {
        if (putLoc == q.length - 1) {
            System.out.println(" - Очередь заполнена!");

            return;
        }

        q[++putLoc] = ch;
    }

    public char get() {
        if (getLoc == putLoc) {
            System.out.println(" - Очередь пуста!");

            return (char) 0;
        }
        return q[++getLoc];
    }
}


Вопросы:
1. Почему в данной реализации не используется нулевой индекс в массиве? Для чего это сделано?
2. Зачем в методе get, возвращается (char) 0?
return (char) 0:
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
lxsmkv
@lxsmkv
Test automation engineer
если очередь пуста указатель getLoc имеет значение 0. Т.е. указывает на нулевой элемент. При добавлении элементов указатель смещается каждый раз на единицу вперед.
Если бы мы начинали класть элементы начиная с нулевого элемента, то пришлось бы что нибудь придумывать чтобы обозначить пустую очередь. Можно было бы поставить getLoc на -1.
В данной реализации, если очередь пуста, возвращаемое значение при запросе будет 0. Это как бы специальное значение-маркер. Однако есть побочный эффект от такой реализации. Если функция get будет использоваться где-то, то нужно будет всегда помнить о значении 0. Иначе можно будет подумать, что в очереди содержится элемент 0.

Более явной на мой взгляд была бы реализация с использованием boolean isEmpty и выбрасыванием исключения при попытке получить последний элемент в пустой очереди.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽