Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_ rob_6_alg.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
101.89 Кб
Скачать

Організація кільцевої черги

Розглянемо приклад. Припустимо, що черга містить три елементи – в позиціях 3, 4 і 5 п'ятиелементні масиви. Цей випадок, показаний на рис. Хоча масив і не заповнений, останній елемент черги зайнятий.

Якщо тепер зробити спробу помістити в чергу елемент G, то він буде записаний в першу позицію масиву, як це показано на рис. Перший елемент черги є Q(3), за яким слідують елементи Q (4), Q(5) і Q(l).

На жаль, при такому представленні досить важко визначити, коли черга порожня. Умова R<F більше не годиться для такої перевірки, оскільки на рис. показаний випадок, при якому дана умова виконується, але черга при цьому не є порожньою.

Одним із способів вирішення цієї проблеми є введення угоди, при якій значення F є індексом елемента масиву, що негайно передує першому елементу черги, а не індексу найпершого елемента. В цьому випадку, оскільки R містить індекс останнього елемента черги, умова F = R має на увазі, що черга порожня.

Відзначимо, що перед початком роботи з чергою, в F і R встановлюється значення останнього індексу масиву, а не 0 і 1, оскільки при такому представленні черги останній елемент масиву негайно передує першому елементу. Оскільки R = F, то черга спочатку порожня.

Основні операції з кільцевою чергою:

1. Вставка елемента q в чергу x.

Insert(q,x)

  1. Вибірка елемента з черги x.

Remove(q)

  1. Перевірка черги на пустоту.

Empty(q)

Операція empty (q) може бути записана таким чином:

if F = R

then empty = true

else empty = false

endif

return

Операція remove (q) може бути записана таким чином:

empty (q)

if empty = true

then print «вибірка з порожньої черги»

stop

endif

if F =maxQ

then F =1

else F = F+1

endif

x = q(F)

return

Відзначимо, що значення F повинне бути модифіковано до моменту видалення елемента.

Операція вставки insert (q,x)

Для того, щоб запрограмувати операцію вставки, повинна бути проаналізована ситуація, при якій виникає переповнення. Переповнення відбувається в тому випадку, якщо весь масив вже зайнятий елементами черги і при цьому робиться спроба розмістити в ній ще один елемент. Розглянемо, наприклад, чергу на рис. В ній знаходяться три елементи — С, D і Е, відповідно розташовані в Q (3), Q (4) і Q (5). Оскільки останній елемент в черзі займає позицію Q (5), значення R рівне 5. Оскільки перший елемент в черзі знаходиться в Q (3), значення F рівне 2. На рис. в чергу поміщається елемент G, що призводить до відповідної зміни значення R. Якщо провести наступну вставку, то масив стає цілком заповненим, і спроба провести ще одну вставку призводить до переповнювання. Це реєструється тим фактом, що F = R, а це якраз і указує на переповнення. Очевидно, що при такій реалізації немає можливості знайти відмінність між порожньою і заповненою чергою Зрозуміло, така ситуація задовольнити нас не може.

Одне з рішень полягає в тому, щоб пожертвувати одним елементом масиву і дозволити черзі рости до об'єму на одиницю меншого від максимального. Так, якщо масив з 100 елементів оголошений як черга, то черга може містити до 99 елементів. Спроба розмістити в черзі 100-й елемент приведе до переповнювання. Підпрограма insert може бути записана таким чином:

if R = max(q)

then R = 1

else R = R+1

endif

'перевірка на переповнення

if R = F

then print «переповнення черги»

stop

endif

q (r) =x

return

Перевірка на переповнення в підпрограмі insert проводиться після встановлення нового значення для R, тоді як перевірка на втрату значущості в підпрограмі remove проводиться зразу ж після входу в підпрограму до моменту оновлення значення F.

Дек

Від англійського DEQ – Double Ended Queue (черга з двома кінцями)

Особливістю деків є те, що запис і зчитування елементів може проводитися з двох кінців.

Дек можна розглядати і у вигляді двох стеків, сполучених нижніми межами. Розглянемо приклад, що ілюструє принцип побудови дека. Розглянемо склад на залізничній станції. Нові вагони до складу можна додавати або до його кінця, або до початку. Аналогічно, щоб від'єднати від складу вагон, що знаходиться в середині, потрібно спочатку від'єднати всі вагони або спочатку, або в кінці складу, від'єднати потрібний вагон, а потім приєднати їх знову.

Операції над деками:

  1. Insert – вставка елемента.

  2. Remove – видалення елемента з дека.

  3. Empty – перевірка на пустоту.

  4. Full – перевірка на переповнення.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]