| 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; { пауза до нажатия ввода }

Перейти на страницу:

Поиск

Похожие книги