Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 6:

Типы данных

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

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;
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >