Шаг 67.
Пример модуля

    На этом шаге мы приведем пример модуля.

    Приведем пример модуля, в котором сосредоточены средства работы с памятью типа "стек". Способ конкретной реализации стека скрыт в разделе Implementation; поэтому переход к другой реализации стека не повлечет за собой необходимость изменения программ, использующих этот модуль (эти программы "не узнают" о таком изменении).

Unit StackOps;  {Операции над стеком}
Interface  {Интерфейсная часть}
      Procedure Push (Elem:Integer);{Размещение элемента в вершине стека}
      Function Pop : Integer;       {Извлечение элемента из вершины стека}
      Function Empty : Boolean;     {Проверка на пустоту стека}
      Function Full : Boolean;      {Проверка на заполненность стека}
Implementation  {Секция реализации}
   {Стек реализован в виде линейного массива элементов;
       переменная Тор отмечает текущую вершину стека}
    Const
       Max = 100; {Максимальное количество элементов в стеке}
    Var
       Stack : Array [1..Max] of Integer; {Массив для элементов стека}
       Top  :  Integer;  {Счетчик количества элементов в стеке}

    Procedure Push;    {Размещение элемента в вершине стека}
    Begin
       If Top<=Max Then {Если есть место в стеке}
           Begin
             Stack [Top]:=Elem;  {Помещаем в стек элемент}
             Top:=Top+1;    {Увеличиваем счетчик количества элементов}
           End;
    End;

    Function Pop;  {Извлечение элемента из вершины стека}
    Begin
       Pop:=0; {Функция возвращает 0, если извлечь элемент не удается}
       if Top>1 Then {Если в стеке есть элементы}
           Begin
              Top:=Top-1; {Уменьшить количество элементов}
              Pop:= Stack[Top]; {Вернуть элемент из стека}
           End;
    End;

    Function Empty;  {Проверка на пустоту стека}
    {Возвращает True, если стек пуст, и False - в противном случае}
    Begin
        Empty:=(Top=1);
    End;

    Function Full;  {Проверка на заполненность стека}
    {Возвращает True, если стек заполнен, и False - в противном случае}
    Begin
      Full:=(Top>Max);
    End;
    Begin      {Инициализация: }
               {первоначально стек пуст }
       Top :=1;
    End.
Текст модуля можно взять здесь.

    Проиллюстрируем использование этого модуля. Для этого созданим программу для работы со стеком. Напомним, что стек - это структура данных, работающая по принципу "последним пришел - первым ушел". Цель приведенной ниже программы - показать использование созданного модуля, поэтому программа будет несколько примитивной (отсутствует контроль за количеством вводимых и выводимых чисел и т.п.).

    Приведем текст программы:

Program Problem67_1;
Uses StackOps;
Var
   N,M,i:Byte;
   a:Integer;
Begin
  WriteLn('Программа иллюстрирует работу со стеком');
  WriteLn('Текущее состояние стека:');
  If Empty Then WriteLn('Стек пуст')
  Else WriteLn('В стеке есть элементы');
  Write('Сколько элементов поместить в стек (не больше 100): ');
  ReadLn(N);
  For i:=1 To N Do
    Begin
      WriteLn(i,'-й элемент: ');
      ReadLn(a); {Запрос элемента}
      Push(a);   {Помещение элемента в стек}
    End;
  WriteLn('Текущее состояние стека:');
  If Empty Then WriteLn('Стек пуст')
  Else WriteLn('В стеке есть элементы');
  Write('Стек заполнен? ');
  If Full Then WriteLn('Да')
  Else WriteLn('Нет');
  Write('Сколько элементов извлечь из стека (не больше ',N,'): ');
  ReadLn(M);
  {Читаем и выводим текущий элемент из стека}
  For i:=1 To M Do
      WriteLn(i,'-й элемент: ',Pop);
  WriteLn('Текущее состояние стека:');
  If Empty Then WriteLn('Стек пуст')
  Else WriteLn('В стеке есть элементы');
End.
Текст программы можно взять здесь.

    Прокомментируем некоторые моменты программы. Обратите внимание, что числа из стека выводятся в обратном порядке. Это обусловлено принципами работы стека. Кроме того, мы не можем из программы воспользоваться значением переменной Top для определения количества элементов, находящихся в стеке. Вы можете убедиться в этом, изменив условную конструкцию следующим образом:


  If Empty Then WriteLn('Стек пуст')
  Else WriteLn('В стеке находится ',Top-1,' элементов');

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

    На следующем шаге мы начнем изучать динамические переменные.


Предыдущий шаг Содержание Следующий шаг