Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование4172 / Лекции / Лекция 18. Очереди.doc
Скачиваний:
51
Добавлен:
12.03.2015
Размер:
99.84 Кб
Скачать

Лекция 18. Очереди. Стеки Очереди

Очередь – это упорядоченная последовательность элементов, в которой операции включения и исключения элементов выполняются по принципу FIFO (First-In-First-Out) - “первым пришел – первым ушел”, т.е. включение всегда происходит в конец очереди, а исключение – из начала очереди (рис. 18.1).

Рис. 18.1. Очередь

Очереди широко используются в операционных системах, например, может возникнуть очередь программ на загрузку в оперативную память, на выполнение к процессору, на обработку файлов и т.д.

Основные операции над очередью:

  1. Инициализация (создание пустой очереди).

  2. Включение элемента в очередь.

  3. Исключение элемента из очереди.

Очередь может храниться в виде циклического вектора или в виде списка.

Представление очереди в виде циклического вектора

В циклическом (кольцевом) векторе за последним элементом следует первый (с индексом 0). Очередь хранится в циклическом векторе с указателями начала и конца (рис. 18.2).

Q[1]

Q[k]

Q[k]

Q[1]

Q[2]

0 Свободная 0 .Очередь

1 ..память

Начало 

Очередь Конец  ..Свободная

j. .память

Конец 

Свободная Начало  .Очередь

N память N

а) Индекс начала очереди < индекса б) Индекс начала > индекса

конца конца очереди

Рис. 18.2. Хранение очереди в виде циклического вектора

(показаны два состояния)

Часть вектора занимает очередь, остальная часть – свободная память. Указатель начала очереди равен индексу первого элемента очереди, а указатель конца – индексу первого свободного элемента в конце очереди (так проще программировать операции над очередью). Для пустой очереди значения указателей равны между собой.

Включение элемента происходит в конец очереди, при этом изменяется указатель конца: ему присваивается индекс следующего свободного элемента вектора. Исключение элемента происходит из начала очереди, при этом указателю начала присваивается индекс следующего элемента очереди (за N следует 0).

Чтобы отличить полную очередь от пустой, один элемент вектора всегда оставляют свободным.

Программирование операций на языке С (C++)

  1. Описание очереди

#define N 50 /* максимальное число элементов в очереди */

тип_элемента Och [N+1]; /* вектор, содержащий очередь */

int un, uk; /* указатели начала и конца очереди */