
Лекция 18. Очереди. Стеки Очереди
Очередь – это упорядоченная последовательность элементов, в которой операции включения и исключения элементов выполняются по принципу FIFO (First-In-First-Out) - “первым пришел – первым ушел”, т.е. включение всегда происходит в конец очереди, а исключение – из начала очереди (рис. 18.1).
Рис. 18.1. Очередь
Очереди широко используются в операционных системах, например, может возникнуть очередь программ на загрузку в оперативную память, на выполнение к процессору, на обработку файлов и т.д.
Основные операции над очередью:
-
Инициализация (создание пустой очереди).
-
Включение элемента в очередь.
-
Исключение элемента из очереди.
Очередь может храниться в виде циклического вектора или в виде списка.
Представление очереди в виде циклического вектора
В циклическом (кольцевом) векторе за последним элементом следует первый (с индексом 0). Очередь хранится в циклическом векторе с указателями начала и конца (рис. 18.2).
|
|
|
… |
Q[k] |
|
… |
|
|
Q[k] |
|
… |
|
|
|
1 ..память
Начало
Очередь Конец ..Свободная
j. .память
Конец
Свободная Начало .Очередь
N память N
а) Индекс начала очереди < индекса б) Индекс начала > индекса
конца конца очереди
Рис. 18.2. Хранение очереди в виде циклического вектора
(показаны два состояния)
Часть вектора занимает очередь, остальная часть – свободная память. Указатель начала очереди равен индексу первого элемента очереди, а указатель конца – индексу первого свободного элемента в конце очереди (так проще программировать операции над очередью). Для пустой очереди значения указателей равны между собой.
Включение элемента происходит в конец очереди, при этом изменяется указатель конца: ему присваивается индекс следующего свободного элемента вектора. Исключение элемента происходит из начала очереди, при этом указателю начала присваивается индекс следующего элемента очереди (за N следует 0).
Чтобы отличить полную очередь от пустой, один элемент вектора всегда оставляют свободным.
Программирование операций на языке С (C++)
-
Описание очереди
#define N 50 /* максимальное число элементов в очереди */
тип_элемента Och [N+1]; /* вектор, содержащий очередь */
int un, uk; /* указатели начала и конца очереди */