Стеком называется динамическая структура данных, добавление компо-
ненты в которую и исключение компоненты из которой производится из
одного конца, называемого вершиной стека. Стек работает по принципу
LIFO (Last-In, First-Out) -
поступивший последним, обслуживается первым.
Обычно над стеками выполняется три операции:
-начальное формирование стека (запись первой компоненты);
-добавление компоненты в стек;
-выборка компоненты (удаление).
Для формирования стека и работы с ним необходимо иметь две пере-
менные типа указатель, первая из которых определяет вершину стека, а
вторая - вспомогательная. Пусть описание этих переменных имеет вид:
var pTop, pAux: Pointer;
где pTop - указатель вершины стека;
pAux - вспомогательный указатель.
Начальное формирование стека выполняется следующими операторами:
ЙННННН» ЙННННН»
New(pTop); є *ДДєДДДї є є
ИНННННј і єНННННє
pTop АДД>є є
ИНННННј
ЙННННН» ЙННННН»
pTop^.pNext:=NIL; є *ДДєДДДї є є
ИНННННј і єНННННє
pTop АДД>є NIL є
ИНННННј
ЙННННН» ЙННННН»
pTop^.D:=D1; є *ДДєДДДї є D1 є
ИНННННј і єНННННє
pTop АДД>є NIL є
ИНННННј
Последний оператор или группа операторов записывает содержимое
поля данных первой компоненты.
Добавление компоненты в стек призводится с использованием вспо-
могательного указателя:
ЙННННН» ЙННННН» ЙННННН»
New(pAux); є *ДДєДДДї є є ЪДДДєДД* є
ИНННННј і єНННННє і ИНННННј
pTop і є є<ДДЩ pAux
і ИНННННј
і
і ЙННННН»
і є D1 є
і єНННННє
АДД>є NIL є
ИНННННј
ЙННННН» ЙННННН» ЙННННН»
pAux^.pNext:=pTop; є *ДДєДДДї є є ЪДДДєДД* є
ИНННННј і єНННННє<ДДЩ ИНННННј
pTop і є *ДДєДї pAux
і ИНННННј і
і і
і ЙННННН» і
і є D1 є і
і єНННННє і
АДД>є NIL є<Щ
ИНННННј
ЙННННН» ЙННННН» ЙННННН»
pTop:=pAux; є *ДДєДДДї є є ЪДДДєДД* є
ИНННННј і єНННННє<ДДЩ ИНННННј
pTop АДД>є *ДДєДї pAux
ИНННННј і
і
ЙННННН» і
є D1 є і
єНННННє і
є NIL є<Щ
ИНННННј
ЙННННН» ЙННННН»
pTop^.D:=D2; є *ДДєДДДї є D2 є
ИНННННј і єНННННє
pTop АДД>є *ДДєДї
ИНННННј і
і
ЙННННН» і
є D1 є і
єНННННє і
є NIL є<Щ
ИНННННј
Добавление последующих компонент производится аналогично.
Рассмотрим процесс выборки компонент из стека. Пусть к моменту на-
чала выборки стек содержит три компоненты:
ЙННННН» ЙННННН»
є *ДДєДДДї є D3 є
ИНННННј і єНННННє
pTop АДД>є *--єДї
ИНННННј і
і
ЙННННН» і
є D2 є і
єНННННє і
ЪДєДД* є<Щ
і ИНННННј
і
і ЙННННН»
і є D1 є
і єНННННє
А>є NIL є
ИНННННј
Первый оператор или группа операторов осуществляет чтение данных
из компоненты - вершины стека. Второй оператор изменяет значение ука-
зателя вершины стека:
ЙННННН» ЙННННН»
D3:=pTop^.D; є *ДДєДДДї є D3 є
pTop:=pTop^.pNext; ИНННННј і єНННННє
pTop і є є
і ИНННННј
і
і ЙННННН»
і є D2 є
і єНННННє
АДД>є *ДДєДї
ИНННННј і
і
ЙННННН» і
є D1 є і
єНННННє і
є NIL є<Щ
ИНННННј
Как видно из рисунка, при чтении компонента удаляется из стека.
Пример. Составить программу, которая формирует стек, добавляет в
него произвольное количество компонент, а затем читает все компоненты
и выводит их на экран дисплея, В качестве данных взять строку симво-
лов. Ввод данных - с клавиатуры дисплея, признак конца ввода - строка
символов END.
Program STACK;
uses Crt;
type
Alfa= String[10];
PComp= ^Comp;
Comp= Record
sD: Alfa;
pNext: PComp
end;
var
pTop: PComp;
sC: Alfa;
Procedure CreateStack(var pTop: PComp; var sC: Alfa);
begin
New(pTop);
pTop^.pNext:=NIL;
pTop^.sD:=sC
end;
Procedure AddComp(var pTop: PComp; var sC: Alfa);
var pAux: PComp;
begin
NEW(pAux);
pAux^.pNext:=pTop;
pTop:=pAux;
pTop^.sD:=sC
end;
Procedure DelComp(var pTop: PComp; var sC:ALFA);
begin
sC:=pTop^.sD;
pTop:=pTop^.pNext
end;
begin
Clrscr;
writeln(' ВВЕДИ СТРОКУ ');
readln(sC);
CreateStack(pTop,sC);
repeat
writeln(' ВВЕДИ СТРОКУ ');
readln(sC);
AddComp(pTop,sC)
until sC='END';
writeln('****** ВЫВОД РЕЗУЛЬТАТОВ ******');
repeat
DelComp(pTop,sC);
writeln(sC);
until pTop = NIL
end.