program stos; {$APPTYPE CONSOLE} uses SysUtils; type stack = ^Tstack; Tstack = record data : integer; next : stack; end; // ========================================================================== // // Dokladanie elementu na stos: procedure Push(Value : integer; var Top : stack); var TempItem : stack; begin TempItem := Top; New(Top); Top.data := value; Top.next := TempItem; end; // ========================================================================== // // Usuwanie elementu ze stosu: function Pop(var Top : stack; var Val : integer) : boolean; var TempItem : stack; begin if Top <> nil then begin Val := Top.data; TempItem := Top; Top := Top.next; Dispose(TempItem); result := true; end else result := false; end; // ========================================================================== // // Kasowanie stosu: procedure Destroy(var Top : stack); var TempItem : stack; begin while (Top <> nil) do begin TempItem := Top.next; Dispose(Top); Top := TempItem; end; end; // ========================================================================== // // Wypisanie zawartosci stosu (od szczytu w dol): procedure List(Top : stack); begin WriteLN('* Elementy stosu: '); while (Top <> nil) do begin WriteLN(Top.data); Top := Top.next; end; WriteLN('* Koniec listy.'); end; // ========================================================================== // // Wypisanie zawartosci stosu (od dolu do szczytu): procedure ListR(Top : stack); var TopR : stack; begin TopR := nil; while (Top <> nil) do begin Push(Top.data, TopR); Top := Top.next; end; List(TopR); Destroy(TopR); end; // ========================================================================== // // Kopiowanie stosu TopS(Source) na stos TopD(Destination): procedure Copy(TopS : stack; var TopD : stack); var TopR : stack; begin TopR := nil; while (TopS <> nil) do begin Push(TopS.data, TopR); TopS := TopS.next; end; while(TopR <> nil) do begin Push(TopR.data, TopD); TopR := TopR.next; end; Destroy(TopR); end; // ================================= TESTER ================================= // var Top : stack; TopCopy : stack; Value : integer; i, j : integer; begin Randomize; WriteLN('=== Testowanie wrzucania 15 elementow na stos...'); for i:=1 to 15 do begin Value := Random(100); Push(Value, Top); WriteLN('Na stos wrzucono liczbe ', Value); end; WriteLN('=== OK.'); WriteLN('=== Testowanie kasowania 5 elementow ze stosu...'); for j:=1 to 5 do begin if Pop(Top, Value) = true then WriteLN('Ze stosu zdjeto liczbe: ', Value) else WriteLN('Brak elementow do zdjecia ze stosu.'); end; WriteLN('=== OK.'); WriteLN('=== Wypisywanie elementow ze stosu od gory...'); List(Top); WriteLN('=== OK.'); WriteLN('=== Wypisywanie elementow ze stosu od dolu...'); ListR(Top); WriteLN('=== OK.'); WriteLN('=== Kopiowanie stosu i wypisywnaie elementow z kopii...'); Copy(Top, TopCopy); List(TopCopy); WriteLN('=== OK.'); WriteLN('=== Testowanie zakonczono pomyslnie.'); ReadLN; ReadLN; end.