Россия, Пошатово |
Типы данных
6.1. Стеки
Пусть T - некоторый тип. Рассмотрим (отсутствующий в паскале) тип "стек элементов типа T ". Его значениями являются последовательности значений типа T.
- Сделать_пустым ( var s: стек элементов типа T )
- Добавить ( t:T ; var s: стек элементов типа T )
- Взять ( var t:T ; var s: стек элементов типа T )
- Пуст ( s: стек элементов типа T ): boolean
- Вершина ( s: стек элементов типа T ): T
(Мы пользуемся обозначениями, напоминающими паскаль, хотя в паскале типа "стек" нет.) Процедура "Сделать_пустым" делает стек s пустым. Процедура "Добавить" добавляет t в конец последовательности s. Процедура "Взять" применима, если последовательность s непуста; она забирает из нее последний элемент, который становится значением переменной t. Выражение "Пуст( s )" истинно, если последовательность s пуста. Выражение "Вершина( s )" определено, если последовательность s непуста, и равно последнему элементу последовательности s.
Мы покажем, как моделировать стек в паскале и для чего он может быть нужен.
Моделирование ограниченного стека в массиве
Будем считать, что количество элементов в стеке не превосходит некоторого числа n. Тогда стек можно моделировать с помощью двух переменных:
Содержание: array [1..n] of T; Длина: integer;
считая, что в стеке находятся элементы
Содержание [1],...,Содержание [Длина].
- Чтобы сделать стек пустым, достаточно положить
Длина := 0
- Добавить элемент t:
{Длина < n} Длина := Длина+1; Содержание [Длина] :=t;
- Взять элемент в переменную t:
{Длина > 0} t := Содержание [Длина]; Длина := Длина - 1;
- Стек пуст, если Длина = 0.
- Вершина стека равна Содержание [Длина].
Таким образом, вместо переменной типа стек в программе на паскале можно использовать две переменные Содержание и Длина. Можно также определить тип stack, записав
const N = ... type stack = record | Содержание: array [1..N] of T; | Длина: integer; end;
(Мы позволяем себе использовать имена переменных из русских букв, хотя обычно паскаль этого не любит.) После этого могут быть - в соответствии с правилами паскаля - описаны процедуры работы со стеком. Например, можно написать
procedure Добавить (t: T; var s: stack); begin | {s.Длина < N} | s.Длина := s.Длина + 1; | s.Содержание [s.Длина] := t; end;