- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Операции над стеком
- •Реализация стека
- •Тема 1. Стеки, очереди, деки
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Реализация основных операций над очередью и деком
Включение элемента со значением v в очередьвыполняется по схеме, приведенной ниже. В схеме не отражена ситуация, когда новый элемент включается в пустую очередь. В этом случае после включения указателиfHeadиfRearдолжны ссылаться на один и тот же вновь созданный элемент, т.е. очередь будет состоять из одного элемента.

Реализация метода включения элемента в очередь:
proceduretQueue.Insert(v: tValue);
var
NewItem: pItem; // вспомогательный указатель на новый элемент
begin
NewItem:= New(pItem); // выделение памяти под новый элемент очереди
NewItem^.Value:= v; // запись v в поле значения нового элемента
NewItem^.Next:=nil;// включенный элемент будет последним
iffRear<>nil // если очередь была не пуста
thenfRear^.Next:=NewItem // то новый элемент становится последним
elsefHead:=NewItem; // иначе включенный элемент - первый
fRear:= NewItem; // перемещение указателя на конец очереди
Inc(fSize); // увеличение числа элементов очереди на 1
end;// procedure tQueue.Insert
Исключение элемента из начала очередивыполняется по той же схеме, что и исключение элемента из вершины стека. В связи с этим при реализации операции вместо написания последовательности операторов, выполняющих нужные действия, целесообразно использовать наследуемый от типаtStackметодPop, исключающий элемент из вершины стека. Если элемент исключается из очереди, состоящей из единственного элемента, то после исключения указательfRear, как иfHead, должен получить значениеnil(очередь пуста).
Реализация метода исключения элемента из очереди:
functiontQueue.Remove: tValue;
begin
Remove:= Pop; // исключение элемента из начала методом Pop стека
// Если в очереди был один элемент, то очередь становится пустой:
if fHead = nil then fRear:=nil;
end;// function tQueue.Remove
Включение элемента со значением v в начало декавыполняется так же, как и включение элемента в стек. В связи с этим при реализации операции целесообразно использовать наследуемый от типаtStackметодPush, включающий элемент в вершину стека. Если элемент включается в пустой дек, то после включения указателиfHeadиfRearбудут ссылаться на один и тот же элемент.
proceduretDEQ.Push(v : tValue);
begin
inheritedPush(v);// включение элемента в начало методом Push стека.
// Если дек был пуст, то элемент становится также и последним:
if fRear = nil then fRear:= fHead;
end;// procedure tDEQ.DPush
Исключение элемента из конца декавыполняется по следующей схеме. Читается значение последнего элемента дека, и в переменнуюDisItemтипаpItemиз указателяfRearпереписывается адрес этого элемента. Затем с помощью передвигаемого по элементам дека указателяItemтипаpItemотыскивается предпоследний элемент дека, адрес которого записывается в переменнуюfRear, а в поле ссылки этого элемента – значениеnil(элемент становится последним в деке). Элемент с указателемDisItemисключается из памяти. Если исключаемый элемент является единственным в деке (признак этого – равенство значенийfHeadиfRear), то после чтения значения исключаемого элемента необходимо присвоить переменнымfHeadиfRearзначениеnil.

functiontDEQ.Delete:tValue;
var
DisItem,PredItem:pItem;// исключаемый и предпоследний элементы
begin
Delete:=fRear^.Value; // возвращение последнего элемента дека
DisItem:= fRear; // исключаемый элемент - последний
iffHead <>fRear// если в деке более одного элемента
thenbegin// то выполняется поиск предпоследнего элемента,
PredItem:= fHead;
while PredItem ^.Next<>fRear do PredItem:= PredItem ^.Next;
fRear:=PredItem;fRear^.Next:=nil;// который становится последним.
end
elsebegin// если в деке один элемент,
fHead:= nil;fRear:=nil;// то после исключения дек становится пустым
end;
Dispose(DisItem);
Dec(fSize); //уменьшение числа элементов дека на 1
end;// function tDEQ.Delete
Операции исключения элемента из очереди и дека неприменимы к пустым структурам, поэтому перед их выполнением необходимо анализировать значение признака «очередь пуста» или «дек пуст».
