Помощь - Поиск - Пользователи - Календарь
Полная версия: Стек.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
2407
Дан стек из чисел, упорядочить по убыванию.
volvo
Можно использовать дополнительный стек?
Altair
Если можно, то все это элементарно реализуемо с помощью материала из FAQ'a:

http://forum.pascal.net.ru/index.php?showtopic=2706
volvo
Oleg_Z

Поэтому и спросил ...
:yes:
Altair
Хм... кстати сортировку ДСД можно включить в FAQ...
volvo, если тот модуль переписать под объектную основу (ООП), и методы обработки списка обозначить директивой virtual, можно будет изменять тип элемента ДСД в самой программе?
просто возникла идея сделать те модули из FAQ'a универсальными...
volvo
Oleg_Z

Дать пример универсального кода без ООП? ;)
Кстати, если хочешь, могу показать как эмулировать шаблоны на Паскале.
Altair
Покажи пожалуйста универсальный код... н омне кажется, что без ООП это будут какие-то "обманы", и код не очень красивый будет... все-таки ООП это красиво ...
А чо зашаблоны? покажи пожалуйста...
volvo
Сам модуль выглядит так:

Код

Unit StackUnit;

Interface

Const
 stackOk = 0;
 stackOverflow = 1;
 stackUnderflow = 2;

Var
 StackError : Byte;

Type
 NodePtr = ^Node;
 Node =
   Record
     Info : Pointer;
     Next : NodePtr;
   End;

 Stack =
   Record
     Head : NodePtr;
     Size : Word;
   End;


Procedure InitStack( Var S : Stack; size : Word );
Procedure ClearStack( Var S : Stack );

Procedure Push( Var S : Stack; Var E );
Procedure Pop( Var S : Stack; Var E );

Function Empty( Var S : Stack ) : Boolean;


Implementation

Var
 SaveHeapError : Pointer;

{$F+}
Function HeapFunc( Size : Word ) : Integer;
 Begin
   HeapFunc := 1;
 End;
{$F-}

Procedure InitStack( Var S : Stack; size : Word );
 Begin
   SaveHeapError := HeapError;
   S.Head := nil;
   S.Size := size;
   StackError := stackOk;
 End;

Procedure ClearStack( Var S : Stack );
 Var T : NodePtr;
 Begin
   StackError := stackOk;
   While S.Head <> nil Do
     Begin
       T := S.Head;
       S.Head := T^.Next;
       FreeMem( T^.Info, S.Size );
       Dispose( T )
     End
 End;

Procedure Push( Var S : Stack; Var E );
 Label Quit;
 Var T : NodePtr;
 Begin
   HeapError := @HeapFunc;
   StackError := stackOverflow;
   T := New( NodePtr );
   If T = nil Then Goto Quit;

   T^.Next := S.Head;
   S.Head := T;
   GetMem( T^.Info, S.Size );
   If T^.Info = nil Then Goto Quit;

   Move( E, T^.Info^, S.Size );
   StackError := stackOk;

 Quit:
   HeapError := SaveHeapError

 End;

Procedure Pop( Var S : Stack; Var E );
 Var T : NodePtr;
 Begin
   StackError := stackUnderflow;
   If S.Head = nil Then Exit;

   T := S.Head;
   S.Head := T^.Next;
   Move( T^.Info^, E, S.Size );
   FreeMem( T^.Info, S.Size );
   Dispose( T );
   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.


А вот пример использования:
Код

uses stackunit;

var
 si: stack;
 i, x: integer;

begin
 initstack(si, sizeof(integer));
 for i := 1 to 20 do
   push(si, i);

 while not empty(si) do
   begin
     pop(si, x);
     write(x:3);
   end;

 writeln;
end.
Altair
А, ну понял... этот метод я знаю... часто используется при переводе $13 на паскаль (вобщемпри работе с диском часто буфера используют нетипизированные)
... нет, ООП красивее smile.gif)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.