Sunteți pe pagina 1din 12

Stive

În figura 1 este reprezentată schema de manevrare a


vagoanelor de tren într-un de-pou. Elaboraţi un
program care citește de la tastatură și afișează pe
ecran datele despre fiecare vagon intrat sau ieșit din
depou.
Datele în studiu includ:
– numărul de înmatriculare (integer);
 – staţia de înmatriculare (string);
– anul fabricării (1960..2000);
– tipul vagonului (string);
– capacitatea de încărcare (real);
– proprietarul vagonului (string).
Cum rezolvam aceasta problema?

Datorită celor prezentate, vom implementa problema


data ca o stiva deoarece fiecare vagon corespunzător
conţine trei informaţii: adresa înainte (a elementului
următor), adresa înapoi şi informaţia utilă care se
diferă de la caz la caz.
Vom folosi limbajul de programare Pascal.
Pentru a lucra cu o astfel de stivă sunt suficiente două
proceduri: adaug şi scot, cu rolul de a adăuga şi,
respectiv, de a scoate o informaţie din stivă.
Date generale de care trebue tinut cont la
rezolvarea acestei probleme:

Prin stivă (în limba engleză stack) înţelegem o


listă unidirecţională cu proprietatea că operaţiile
de introducere şi extragere a elementelor se fac la
un singur capăt al ei. Poziţia ocupată în stivă de
ultimul element introdus poartă numele de vîrf.
O stivă fără niciun element se numeşte stivă vidă.
Pentru exemplificare, în figura 2 este prezentată o
stivă care conţine elementele A, B, C.
Cum se reprezinta o stiva?

S C

S C
B
B
A
A
Reprezentatea generalizată

Reprezentatea detaliata

Datele necesare pentru crearea şi prelucrarea unei


stive pot fi definite prin decla-raţii de forma:

type AdresaCelula=^Celula; Celula=record


Info : string; Prec : AdresaCelula
end;
var S : AdresaCelula;
Figura 3

D D
S
C s s
C C
B B B
A A A
Introducearea elementului D Extragerea elementelor D şi C
Stiva iniţială

Operaţia de introducere a unui element în stivă (fig.3)


este efectuată de secven-ţa de instrucţiuni:
new(R); { crearea unei celule }
{încărcarea informaţiei utile în cîmpul R^.Info }
R^.Prec:=S; {crearea legăturii către celula precedentă din stivă}
S:=R; { actualizarea adresei vîrfului }

unde R este o variabilă de tipul AdresaCelula.


Extragerea unui element din stivă (fig. 3) este
efectuată de secvenţa:

R:=S; { memorarea adresei celulei extrase }


{ prelucrarea informaţiei din cîmpul R^.Info }
S:=S^.Prec; { eliminarea celulei din stivă }
dispose(R); { distrugerea celulei extrase }

Stivele mai poartă şi numele de liste LIFO (last in,


first out — ultimul element care a intrat în stivă va fi
primul care va ieşi din ea) şi sînt frecvent utilizate
pentru aloca-rea dinamică a memoriei în cazul
procedurilor şi funcţiilor recursive
. Evident, stivele pot fi simulate utilizînd tablourile
unidimensionale array[1..n] of ..., însă o astfel de
reprezentare este limitată de cele n componente ale
tablourilor.

S-ar putea să vă placă și