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

Как понять циклический алгоритм очереди?

Более менее с фиксированной очередью разобрался, но теперь не могу понять проверку условия в циклической очереди.
Есть вот такой кусок кода с реализацией метода put().
public class CircularQueue {
    private char[] q;
    private int putLoc, getLoc;

    public CircularQueue(int size) {
        q = new char[size + 1];

        putLoc = getLoc = 0;
    }

    public void put(char ch) {
        if (putLoc + 1 == getLoc | ((putLoc == q.length - 1) & (getLoc == 0))) {
            System.out.println("Очередь заполнена");
            
            return;
        }
        
        if (putLoc == q.length) {
            putLoc = 0;
        }
        
        q[++putLoc] = ch;
    }
}


Объясните пожалуйста, как понять то что проверяется в методе put().
Вот как понять эту строку if (putLoc + 1 == getLoc | ((putLoc == q.length - 1) & (getLoc == 0)))?
  • Вопрос задан
  • 716 просмотров
Решения вопроса 1
15432
@15432
Системный программист ^_^
Пусть это ваша очередь:
--++++---
(Плюсы где занято)
putloc - индекс места в массиве, куда кладутся данные (последнее место куда положили плюс, самый правый), getloc - откуда плюсы забирают (самый левый плюс)
--[++++]---
Так как очередь циклическая, правая граница плюсов может догнать левую
++][+++++++
это и проверяется (putloc+1 = getloc)
Ну и если граница ровно на конце массива, нужно второе условие проверки
[+++++++++]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы