Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_SAOD_-_Dinamicheskie_struktury_dannykh.doc
Скачиваний:
120
Добавлен:
21.03.2016
Размер:
1.66 Mб
Скачать
    1. Реализация основных операций над стеком

Включение элемента со значением 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

    1. Использование стека для преобразования форм записи выражений.

В инфиксной записи операция разделяет два операнда, в постфиксной – операция следует за двумя операндами, в префиксной – операция предшествует двум операндам. Например:

Инфиксная запись

Постфиксная запись

Префиксная запись

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

  • Перевод из инфиксной формы записи выражения в постфиксную (польскую).Инфиксное выражение сканируется слева направо, и в зависимости от вида очередного элемента выражения выполняется одно из следующих действий:

Элемент выражения

Действие

Открывающая скобка

Вталкивание элемента в стек.

Операнд

Запись элемента в постфиксную строку.

Закрывающая скобка

Выталкивание элементов из стека до первой открывающей скобки и запись их в постфиксную строку, затем выталкивание самой открывающей скобки без записи ее в постфиксную строку. Если перед выполнением этой операции стек оказался пустым, значит, для данной закрывающей скобки не было парной открывающей, т.е. возникла исключительная ситуация.

Операция

Если стек не пуст, и приоритет операции ниже (), чем у верхней операции в стеке, то выталкивание элементов из стека до операции с меньшим приоритетом или до опустошения стека и запись их в постфиксную строку; в противном случае стек не изменяется. Затем вталкивание операции в стек.

После просмотра выражения выталкиваются из стека и записываются в постфиксную строку все оставшиеся в стеке операции.

  • Вычисление значения выражения по его постфиксной записи.

Постфиксное выражение сканируется слева направо и обрабатывается следующим образом:

Элемент выражения

Действие

Операнд

Вталкивание элемента в стек

Операция

Выталкивание из стека двух элементов, выполнение операции с ними, запись результата в стек, если стек не пуст.

  • Перевод из инфиксной формы записи выражения в префиксную.

Инфиксное выражение сканируется справа налево, и префиксная строка строится также справа налево. Алгоритм преобразования такой же, как и при преобразовании в постфиксную форму, только открывающие скобки меняются на закрывающие и, наоборот, при определении приоритета операции «» изменяется на «<», чтобы равноприоритетные операции выполнялись слева направо.

  • Вычисление значения выражения по его префиксной записи.

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