
- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Реализация основных операций над стеком
Включение элемента со значением v в стек:
Одинарными линиями показаны связи в исходном состоянии стека, пунктирными – связи, устанавливаемые в процессе выполнения операции. Сначала организуется вспомогательная динамическая переменная с указателем NewItemтипаpItem. В поле значения этой переменной записывается значение нового элемента стека, в поле ссылки – адрес верхнего элемента стека, на который указывала ранее переменнаяfHead. Затем указательfHeadполучает значение адреса вновь созданного элемента стека.
Реализация метода включения элемента в стек:
proceduretStack.Push(v:tValue);
var
NewItem: pItem;// указатель на новый элемент
begin
NewItem:= New(pItem); // выделение памяти под новый элемент стека
NewItem^.Value:= v; // запись v в поле значения нового элемента
NewItem^.Next:=fHead;// fHead -> в поле ссылки нового элемента
fHead:= NewItem; // перемещение fHead на новый элемент
Inc(fSize);// увеличение числа элементов стека на 1
end;// procedure tStack.Push
Исключение элемента из стека. Сначала читается значение верхнего элемента стека. Затем в переменнуюDisItemтипаpItemиз указателяfHeadпереписывается адрес верхнего элемента стека. УказательfHeadперемещается на элемент стека, следующий за выталкиваемым, и освобождается занимаемая исключаемым элементом память. Схема исключения:
Реализация метода исключения элемента из стека:
functiontStack.Pop:tValue;
// Исключение верхнего элемента из стека и возвращение его значения
var
DisItem: pItem;// указатель на исключаемый элемент
begin
Pop:= fHead^.Value; // чтение верхнего элемента стека
DisItem:= fHead; // получение адреса исключаемого элемента
fHead:= fHead^.Next; // перемещение вершины на следующий элемент
Dispose(DisItem); // удаление из памяти бывшего верхнего элемента
Dec(fSize);// уменьшение числа элементов стека на 1
end;// function tStack.Pop
Операция Popнеприменима к пустому стеку, поэтому перед ее выполнением необходимо проверять значение признака «стек пуст».
Выработка признака «стек пуст»выполняется следующим образом:
functiontStack.Empty: Boolean;
// Возвращает Empty=True, если стек пуст
begin
Empty:= fHead = nil;
end; // function tStack.Empty
Использование стека для преобразования форм записи выражений.
В инфиксной записи операция разделяет два операнда, в постфиксной – операция следует за двумя операндами, в префиксной – операция предшествует двум операндам. Например:
Инфиксная запись |
Постфиксная запись |
Префиксная запись |
A+B |
AB+ |
+AB |
A+B–C |
AB+C– |
+A–BC |
A*B+C |
AB*C+ |
+*ABC |
A+B*C |
ABC*+ |
+A*BC |
(A+B)*C |
AB+C* |
*+ABC |
Перевод из инфиксной формы записи выражения в постфиксную (польскую).Инфиксное выражение сканируется слева направо, и в зависимости от вида очередного элемента выражения выполняется одно из следующих действий:
Элемент выражения |
Действие |
Открывающая скобка |
Вталкивание элемента в стек. |
Операнд |
Запись элемента в постфиксную строку. |
Закрывающая скобка |
Выталкивание элементов из стека до первой открывающей скобки и запись их в постфиксную строку, затем выталкивание самой открывающей скобки без записи ее в постфиксную строку. Если перед выполнением этой операции стек оказался пустым, значит, для данной закрывающей скобки не было парной открывающей, т.е. возникла исключительная ситуация. |
Операция |
Если стек не пуст, и приоритет операции ниже (), чем у верхней операции в стеке, то выталкивание элементов из стека до операции с меньшим приоритетом или до опустошения стека и запись их в постфиксную строку; в противном случае стек не изменяется. Затем вталкивание операции в стек. |
После просмотра выражения выталкиваются из стека и записываются в постфиксную строку все оставшиеся в стеке операции.
Вычисление значения выражения по его постфиксной записи.
Постфиксное выражение сканируется слева направо и обрабатывается следующим образом:
Элемент выражения |
Действие |
Операнд |
Вталкивание элемента в стек |
Операция |
Выталкивание из стека двух элементов, выполнение операции с ними, запись результата в стек, если стек не пуст. |
Перевод из инфиксной формы записи выражения в префиксную.
Инфиксное выражение сканируется справа налево, и префиксная строка строится также справа налево. Алгоритм преобразования такой же, как и при преобразовании в постфиксную форму, только открывающие скобки меняются на закрывающие и, наоборот, при определении приоритета операции «» изменяется на «<», чтобы равноприоритетные операции выполнялись слева направо.
Вычисление значения выражения по его префиксной записи.
Алгоритм вычисления полностью совпадает с алгоритмом вычисления по постфиксной записи, но префиксная строка сканируется справа налево.