Инициализация очереди
Пример
ТОРГОВЫЙ ЗАЛ
Операция insert(q,x)
ПОКУПАТЕЛИ
Операция empty(q)
КАССА
 НАБЛЮДАТЕЛЬ
 НАБЛЮДАТЕЛЬ
J
|   | 
z
| с^°г | 
операция x=remove(q)
Рис. 2.9. Графическое представление очереди Объявление пустой очереди
#define Maxg 5
float git[Maxg];
frnt=l; rear=0;
Игнорируя возможность переполнения очереди, операцию insert(g, x) запишем следующим образом:
геаг++; git[rear] = х; ,
а операцию х = remove(g) так:
x = git[frnt\;
frnt++; .
На рис. 2.10 показано, что произойдет при таком представлении.
| git | git | git | git | |||||
| 5 4 3 2 | 5 4 3 2 1 | 5 4 3 2 1 | с | 5 4 3 2 1 | e d с | |||
| с | ||||||||
| b a | ||||||||
| frnt= rear= | 1 rear= 0 frnt= | 3 frnt= 1 rear= | 1 rear= 3 frnt=: | 5 3 | 
Рис. 2.10. Элементы в очереди
Изначально очередь пуста. Размер массива git будет 5. В результате выполнения операции insert и remove в очереди будут находиться три элемента. Больше поместить нельзя.
Одним из решений этой проблемы является модификация операции remove таким образом, чтобы при удалении элемента смещать очередь к началу.
х = git[0] ;
for(i=0; i<rear-l; i + +[ {
 git [i
 git [i
git[i+1];
rear-
Переменной frnt не требуется, так как первый элемент — начало очереди. Для пустой очереди rear = 0. Метод непроизводителен, так как требует перемещение оставшихся элементов.
Другой способ предлагает рассматривать массив в виде циклического связанного списка. Недостаток — трудно определить, когда очередь пуста, так как условие rear <frnt не выполняется.
Рассмотрим следующий пример (рис. 2.11). Одним из способов решения проблемы является соглашение о том, что frnt является индексом элемента, предшествующего первому элементу. В этом случае для пустой очереди frnt = rear.
| e | 5-ти элементный | е | frnt=3 | |||
| 4 3 2 | масив. Если необходимо разместить элемент f, то он пишется в первую | 4 3 2 | rear=1 rear<frnt, rear=1 rear<fmt, но | |||
| d | d | |||||
| с | с | |||||
| f | очередь | |||||
| позицию. | не пуста | |||||
| frnt= | frnt- | |||||
| rear=0 | rear=3 | 
Рис. 2.11. Пример
| #define Maxg | ||
| float | git[Maxg]; | |
| f rnt = | = Maxg; | |
| rear = | = Maxg; | 
Операция empty
if(frnt == rear) empty=l; else empty =0;
Операция remove
| if | (empty | == 1) | ||
| printf( | "Очередь | пуста") | r | |
| if | (frnt = | = Maxg-1) | frnt = | 0; | 
| else frnt | = frnt + | 1; | ||
| remove = g | it[frnt]; | 
При реализации вставки необходимо контролировать ситуацию переполнения, при которой frnt = rear. Это же условие характеризует пустую очередь. Одно из решений проблемы — очередь растет до Maxg-\.
Операция insert
/^выделение места для элемента*/ if (rear == Maxg - 1) rear = 0; else rear = rear + 1;
| /^проверка | на переполнение | */ | 
| if (rear = | = frnt) | |
| printf( | "Переполнение." | ) ; | 
| git [rear] | = x; |