Стек — динамическая структура данных, представляющая из себя упорядоченный набор элементов, в которой добавление новых элементов и удаление существующих производится с одного конца, называемого вершиной стека. Элементы извлекаются из стека в порядке, обратном их добавлению в эту структуру, т.е. действует принцип «последний пришёл — первый ушёл».
Выделим типовые операции над стеком и его элементами:
-добавление элемента в стек;
-удаление элемента из стека;
-проверка, пуст ли стек;
-просмотр элемента в вершине стека без удаления;
-очистка стека.
Размеров памяти стека можно управлять директивой $M (не превышает 64К)
{$M < размер стека >,mind, MaxD} где < размер стека > от 1к до 664 к (по умолчанию 16 к)
MinD —минимальный размер динамической памяти (носит ограничительный характер, устанавливает тот объем требуемой памяти при отсутствии которого программа вообще не может выполняться. Если mind=0, то запускается в любом случае).
maxD- максимальный размер динамической памяти (носит рекомендательный характер.
Занесение элемента в стек производится аналогично вставке нового элемента в начало списка. Процедура занесения элемента в стек должна содержать два параметра: первый задает вершину стека, в который нужно занести элемент, второй — заносимое значение элемента стека.
Процедура формирования стека будет иметь следующий вид:
Procedure FormStack;
Var
Stack : EXST; {Текущая переменная}
Digit : integer;
Procedure writeStack(Var u : EXST; Digit : integer);
Var
x : EXST;
Begin
new(x); {выделяем память под хранение нового элемента стека}
x^.Data := Digit; {заполняем поле данных элемента}
x^.Next := u; {новый элемент «связываем» со стеком}
u := x; {созданный элемент определяем как вершину стека}
End;
Begin
Stack := Nil; {инициализация стека}
writeln('Введите элементы стека. Окончание ввода — 0');
read(Digit);
while Digit < > 0 do
begin
writeStack(Stack, Digit);
read(Digit);
end;
End;
Извлечение элемента из стека
В результате выполнения этой операции некоторой переменной i должно быть присвоено значение первого элемента стека, и значение указателя на начало списка должно быть перенесено на следующий элемент стека.Procedure readStack(Var u : EXST; Var i : integer);
Var
x : EXST;
Begin
i := u^.Data; {считываем значение поля данных в переменную}
x := u; {запоминаем адрес вершины стека}
u := u^.Next; {переносим вершину стека на следующий элемент}
dispose(x); {освобождаем память, занятую уже ненужным элементом стека}
End.