Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД Part 1.DOC
Скачиваний:
43
Добавлен:
02.11.2018
Размер:
1.68 Mб
Скачать
    1. Реализация основных операций над стеком

Включение элемента со значением v в стек:

Одинарными линиями показаны связи в исходном состоянии стека, пунктирными – связи, устанавливаемые в процессе выполнения операции. Сначала организуется вспомогательная динамическая переменная с указателем NewItem типа pItem. В поле значения этой переменной записывается значение нового элемента стека, в поле ссылки – адрес верхнего элемента стека, на который указывала ранее переменная fHead. Затем указатель fHead получает значение адреса вновь созданного элемента стека.

Реализация метода включения элемента в стек:

procedure tStack.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 перемещается на элемент стека, следующий за выталкиваемым, и освобождается занимаемая исключаемым элементом память. Схема исключения:

Реализация метода исключения элемента из стека:

function tStack.Pop:tValue;

// Исключение верхнего элемента из стека и возвращение его значения

var

DisItem: pItem; // указатель на исключаемый элемент

begin

Pop:= fHead^.Value; // чтение верхнего элемента стека

DisItem:= fHead; // получение адреса исключаемого элемента

fHead:= fHead^.Next; // перемещение вершины на следующий элемент

Dispose(DisItem); // удаление из памяти бывшего верхнего элемента

Dec(fSize); // уменьшение числа элементов стека на 1

end; // function tStack.Pop

Операция Pop неприменима к пустому стеку, поэтому перед ее выполнением необходимо проверять значение признака «стек пуст».

Выработка признака «стек пуст» выполняется следующим образом:

function tStack.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

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

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

Действие

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

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

Операнд

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

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

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

Операция

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

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

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

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

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

Действие

Операнд

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

Операция

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

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

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

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

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