Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Редьков Е.В_otv.doc
Скачиваний:
0
Добавлен:
04.01.2020
Размер:
834.05 Кб
Скачать

Стек. Отличия стека от списка. Основные операции со стеком.

На предыдущих занятиях мы уже рассматривали однонаправленный список. Здесь Вы познакомитесь с двумя разновидностями обычного линейного списка – стеком и очередью. В программировании наиболее часто используемой структурой является стек.

Стек – это линейный список, в котором добавление новых элементов и удаление существующих производится только с одного конца, называемого вершиной стека.

Стек часто называют структурой LIFO [сокращение LIFO означает Last In – First Out (последний пришел, первый вышел)]. Это сокращение представляет удобный способ запомнить механизм работы стека

Изобразим стек графически:

При программировании на Паскале стек реализуется чаще всего в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий. Считается лишь, что для этого списка не существует обход элементов. Доступ возможен только к верхнему элементу структуры.

Стек предполагает вставку и удаление элементов, поэтому он является динамической, постоянно меняющейся структурой.

Стеки довольно часто встречаются в практической жизни. Простой пример: детская пирамидка. Процесс ее сборки и разборки подобен процессу функционирования стека.

Итак, если стек – это список, то добавление или извлечение элементов происходит с начала и только с начала (или возможно с конца и только с конца) списка.

Значением указателя, представляющего стек, является ссылка на вершину стека, каждый элемент стека содержит поле ссылки.

Таким образом, описать стек можно следующим образом:

Type   EXST = ^ST;   ST = record        Data : integer;        Next : EXST;   end; Var   Stack : EXST; {Текущая переменная}

Если стек пуст, то значение указателя равно Nil.

Рассмотрим возможные операции со стеком.

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

Занесение элемента в стек производится аналогично вставке нового элемента в начало списка. Процедура занесения элемента в стек должна содержать два параметра: первый задает вершину стека, в который нужно занести элемент, второй – заносимое значение элемента стека.

Процедура формирования стека будет иметь следующий вид:

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.

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

Function FreeStack(u : EXST) : boolean;