| > 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; { пауза до нажатия ввода }
| >ReInitStack(St,SizeOf(Real)); {изменяется тип данных }