Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_№2_Списки на базе массива.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
123.9 Кб
Скачать

Очередь. Реализация очереди на базе циклического массива

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

  1. Описание реализации очереди:

В качестве базы выступает массив Q фиксированной длины N, таким образом, очередь ограничена и не может содержать более N-1 элементов. Индексы элементов массива изменяются в пределах от 1 до N.

Кроме массива, реализация очереди хранит две простые переменные: индекс начала очереди (голова – head), индекс конца очереди ( хвост – tail).

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

Рис. 5

1

2

3

4

5

6

N

Q

15

26

22

47

Tail=2 Head=5

Рис. 6

Для эффективности алгоритмов обработки очереди между головой и хвостом должна быть пустая ячейка, т.е Tail указывает на первую свободную ячейку (см. Рис. 6).

Первоначально имеем head=0, tail=1, т.е. очередь пуста.

Так как массив циклический, то при процедурах вставки нового элемента в очередь и удаления элемента из очереди позиция хвоста (Tail) и головы (Head) определяется неоднозначно: если Tail=n, то следующая позиция Tail=1, в остальных случаях Tail=Tail+1. Определение следующей позиции для хвоста и головы оформим в виде функции:

Function Pos (P)

{определяет следующую позицию для переменной p}

If P=n then Pos=1

Else Pos=P+1

При вставке нового элемента в очередь, необходимо сначала определить, есть ли свободное место с помощью процедуры Pos (Tail). Если голова и хвост встретились, то очередь переполнена.

procedure ADD_ELEM(Q, Head, tail, X)

{вставка элемента X в хвост очереди Q}

if Pos(Tail)=Head then 'Переполнение'

else Q[tail]=X

Tail=Pos(Tail)

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

Во многих важных приложениях требуется выбрать среди динамически изменяемого множества элемент с наивысшим приоритетом. Часто для решения подобной задачи применяют структуру данных, которая называется очередью с приоритетами. Эта очередь представляет собой совокупность элементов данных, частично упорядоченных по какому-либо правилу. К основным операциям над очередью с приоритетами относятся: поиск максимального элемента, извлечение максимального элемента и добавление нового элемента. Само собой разумеется, что последние две операции должны быть реализованы так, чтобы в результате их выполнения получалась новая очередь с приоритетами.

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

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

Списки. Реализация списков на базе массива

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

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

В математике список определяется как последовательность элементов определенного типа: X1, X2, … Xn , где n>=0. Количество элементов n называется длиной списка, X1первый элемент списка, Xn – последний элемент списка. В случае n=0, список пустой. Важное свойство списка заключается в том, что его элементы можно линейно упорядочить в соответствии с их позицией в списке, т.е., Xi предшествует Xi+1 и следует за Xi-1. Элемент Xi имеет позицию i.