Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

21.3.Стеки

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

По определению, элементы извлекаются из стека в порядке, обратном их добавлению, т.е. действует принцип «последним пришёл – первым вышёл» (LIFO – Last In First Out).

Основные операции над стеком:

  • Занесение в стек (принято называть Push);

  • Выборка из стека (принято называть Pop);

Дополнительные операции:

  • Создание пустого стека (DoTop);

  • Проверка, пуст ли стек (IsEmpty);

  • Просмотр элемента в вершине стека без удаления (InTop);

  • Перемена местами двух элементов в вершине стека (Swap).

21.3.1.Реализация стека через односвязный линейный список

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

Указатель Top ссылается на запись, находящуюся в вершине стека.

type ref=^Elem; {Тип указателя на элементы стека}

Elem = record {Тип элемента стека}

inf:integer; {Поле для информации}

next:ref {Поле для указателя на следующий элемент}

end;

var Top:ref;

procedure DoTop; //Создание пустого стека}

begin

Top:=nil

end;

function IsEmpty:boolean; //Проверка, пуст ли стек

begin

Result:=(Top=nil)

end;

procedure Push(x:integer); //Занесение числа x в стек

var p:ref;

begin

new(p);

p^.inf:=x;

p^.next:=Top; {Новый элемент стека указывает на прежнюю вершину стека}

Top:=p {Указатель вершины стека установлен на новый элемент стека}

end;

function Pop:integer; //Выборка из стека целого числа

var p:ref;

begin

Result:=Top^.inf; //Значение из вершины стека

p:=Top;

Top:=Top^.next; //Исключение верхнего элемента

dispose(p) //Освобождение динамической памяти, которую занимал элемент из вершины стека

end;

function InTop:integer; //Просмотр элемента в вершине стека без удаления}

begin

Result:=Top^.inf; //Значение из вершины стека

end;

procedure Swap; //Перемена местами двух элементов в вершине стека

var x:integer;

begin

x:=Top^.inf;

Top^.inf:=Top^.next^.inf;

Top^.next^.inf:=x;

end;

21.3.2.Применение стеков

Стеки используют при синтаксическом анализе текста в компиляторах, при вычислении выражений. Через стек реализован вызов подпрограмм: подпрограмма, вызванная последней, первой заканчивает работу.

Пример. Пусть имеется текстовая строка, сбалансированная по круглым скобкам. Необходимо вывести таблицу, в каждой строке которой будут находиться координаты соответствующих пар скобок, т.е. номера символов ‘(‘ и ‘)’ в строке.

Будем посимвольно просматривать строку и как только встретим открывающую скобку ‘(‘, занесем ее координату в стек. При встрече закрывающей скобки ‘)’ возьмем из стека верхний элемент (это координата открывающей скобки) и выведем ее в таблицу вместе с координатой данной ‘)’. Если при попытке взятия из стека он окажется пустым, а после завершения просмотра строки, наоборот, не пустым, число открывающих и закрывающих скобок не совпадает.

Допустим, имеем строку

(

a

+

b

*

c

)

/

2

-

(

a

+

b

)

*

(

d

+

c

/

(

f

-

g

)

)

1

7

11

15

17

22

26

27

Должна быть получена таблица:

Откр Закр

1 7

11 15

22 26

17 27

procedure Error;

begin writeln(‘Число открывающих и закрывающих скобок не совпадает’); halt {Прекращение работы программы}

end;

begin {программа}

DoEmpty; {Создание пустого стека}

write(‘Введите строку’); readln(S);

for i:=1 to length(S) do

begin

if S[i]=‘(‘ then Push(i); {Занесение в стек номера символа ‘(‘}

if S[i]=‘)‘

then if not IsEmpty {Стек не пуст при встрече ‘)’}

then writeln(Pop:4,i:4) {Вывод координаты ‘(‘ из стека и координаты ‘)’}

else Error

end;

if not IsEmpty then Error {Если стек не пуст после завершения просмотра строки}

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]