Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 139

| > 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)); {изменяется тип данных }