IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Стек.
2407
сообщение 6.11.2004 20:09
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


Дан стек из чисел, упорядочить по убыванию.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 7.11.2004 9:32
Сообщение #2


Гость






Сам модуль выглядит так:

Код

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.


Сообщение отредактировано: volvo - 7.11.2004 9:37
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.06.2025 3:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"