Инициализация очереди
Пример
ТОРГОВЫЙ ЗАЛ
Операция 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+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; |