| StackError := StackOk; { все в порядке }
| END;
| PROCEDURE СlearStack(VAR S : Stack);
| VAR Deleted : NodePtr; { удаляемый элемент }
| BEGIN
| StackError := StackOk;
| while S.Head <> nil do
| begin { Цикл по всем элементам:}
| Deleted := S.Head; { удаляемый узел }
| S.Head := Deleted^.Next; { продвижение вершины }
| FreeMem(Deleted^.Info,S.Size); { удаление значения }
| Dispose(Deleted); { удаление узла }
| end { while }
| END;
Рис. 11.10 (продолжение)
- 217 -
| PROCEDURE Push( VAR S : Stack; VAR E );
| LABEL Quit;
| VAR
| NewNode : NodePtr; { новый узел }
| BEGIN { Подстановка функции }
| HeapError := @HeapFunc; { обработки ошибок. }
| StackError := StackOverflow; { возможно переполнение }
| NewNode := New(NodePtr); { размещение узла }
| if NewNode = nil
| then goto Quit; { Негде! Выход. }
| NewNode^.Next := S.Head; { установление связи }
| S.Head := NewNode; { продвижение вершины }
| GetMem(NewNode^.Info,S.Size); { размещение значения }
| if NewNode^.Info = nil
| then goto Quit; { Негде! Выйти. }
| Move(E, NewNode^.Info^,S.Size); { перенос значения }
| StackError := StackOk; { Все в порядке. Выход }
| Quit:
| HeapError := SaveHeapError; { вернем старую функцию }
| END;
| PROCEDURE Pop( VAR S : Stack; VAR E );
| VAR Deleted : NodePtr; { выталкиваемый узел }
| BEGIN
| StackError := StackUnderflow; { возможна неудача }
| if S.Head = nil then Exit; { Стек пуст! Выход. }
| Deleted := S.Head; { удаляемый узел }
| S.Head := Deleted^.Next; { продвижение вершины }
| Move(Deleted^.Info^,E,S.Size); { перенос значения }
| FreeMem(Deleted^.Info,S.Size); { удаление значения }
| Dispose(Deleted); { удаление узла }
| StackError := StackOk; { все в порядке }
| END;
| PROCEDURE Top( VAR S : Stack; VAR E );
| BEGIN
| StackError := StackUnderflow; { возможна неудача }
| if S.Head = nil then Exit; { Стек пуст! Выход. }
| Move(S.Head^.Info^,E.S.Size); { перенос значения }
| StackError := StackOk; { все в порядке }
| END;
| FUNCTION Empty( VAR S : Stack ) : Boolean;
| BEGIN
| Empty := S.Head = nil { пусто, если список пуст }
| END;
| END. { unit StackManager }
Рис. 11.10 (окончание)
- 218 -
| PROGRAM UsesStack;{ПРОГРАММА, ХРАНЯЩАЯ ЗНАЧЕНИЯ В СТЕКЕ}
| USES StackManager; VAR
| St : Stack; { переменная структуры типа Stack (стек) }
| I : Integer;
| R : Real;
| В : Byte;
| BEGIN
| InitStack( St, SizeOf( Integer ) ); { стек целых }
| { Поместить в стек 100 целых значений: }
| for I:=1 to 100 do Push( St, I );
| WriteLn( ' ':20, 'Первые 100 чисел' );
| WriteLn( ' ': 20, '(целые значения)' );
| WriteLn;
| while not Empty(St) do begin { Пока стек не пуст: }
| for В := 1 to 10 do begin {порциями по 10 элементов}
| Pop( St, I ); { вытолкнуть очередное зна- }
| Write( I:5 ) { чение и напечатать его }
| end; { for В }
| WriteLn { закрытие строки 10 чисел }
| end; { while }
| ReadLn; { пауза до нажатия ввода }