Sunteți pe pagina 1din 8

Stiva.

Aspectul logic al stivei Una dintre cele mai importante i folositoare concepii n tehnicile de programare este concepia de stiv. S ncercm s dm cteva noiuni ale stivei sub aspect logic. Def. 1. Stiva o list secvenial cu lungimea variabil, inserarea i eliminarea elementelor creia se face numai la un capt al ei, numit vrful stivei. Def. 2. Stiva este o form de organizare a datelor (structur de date) cu proprietatea c operaiile de introducere i scoatere a datelor, se fac la un capt al ei numit vrful stivei (este o structur tip LIFO - Last In, First Out, Ultimul sosit, primul ieit). Def. 3. Stiva reprezint o mulime ordonat (fiecare element este ordonat n raport cu baza stivei) i omogen (de acelai tip) de elemente n care plasarea elementelor noi i eliminarea celor existente se face numai la un capt al ei, numit vrful stivei. Grafic stiva se poate reprezenta ca n figura alturat. Exemple de stive: platourile de la o cafenea aezate una peste alta, stiv de monede, crmizi, o cutie cu cmi, o Push Pop stiv de cri, linia de manevrare a vagoanelor ntr-un depou etc. Stiva este util n situaii n care necesar memorarea unor informaii i Vrf S regsirea acestora ntr-o anumit ordine, descris de principiul LIFO. T Stiva este utilizat atunci cnd programul trebuie s amne execuia unor I operaii, pentru a le executa ulterior, n ordine invers a apariiei lor. V Operaia curent este cea corespunztoare vrfului stivei, n stiv fiind A Baz reinute toate informaiile necesare programului pentru a executa operaiile respective Fig. 1 1. Operaii specifice cu stive Stivele pot fi implementate utiliznd att structuri statice de date (vectori) ct i structuri dinamice de date deoarece numrul de componente se modific n timpul execuiei programului (dimensiunea stivei crete sau descrete). Aspectul dinamic al structurii determin apariia n timp a unor noi componente, care trebuie legate n structura dinamic de celelalte componente. Structurile dinamice sunt mult mai flexibile dect cele statice i extrem de avantajoase. Stiva, dup cum s-a menionat mai sus, este o colecie de elemente pentru care la un moment dat este vizibil un singur element, cel din vrful ei. Alegerea elementelor se face pe baza ordinii n care elementele au fost introduse n respectiva colecie. Structura de date care implementeaz o stiv are un mecanism prin care se memoreaz aceast ordine. Pe baza acestei informaii, se stabilete elementul vizibil i anume, pentru stiv acest element este cel mai recent introdus n structur. Ordinea elementelor din structur nu poate fi modificat, adic se poate utiliza un singur criteriu de alegere a elementului urmtor. Exist dou operaii asociate acestor tipuri de structuri: introducerea i, respectiv, extragerea unui element. Operaia de extragere are ca efect: obinerea valorii elementului vizibil; eliminarea acestuia din structur. Dac n structur mai exist elemente, n funcie de ordinea de introducere a lor, este stabilit noul element care devine vizibil.

Pentru stive, operaiile de introducere, respectiv, extragere au nume utilizate n mod tradiional i anume PUSH pentru operaia de introducere n stiv, respectiv, POP pentru operaia de extragere din stiv. n afar de aceste operaii, pentru stiv se pot defini i alte operaii, ca de exemplu: operaia de iniializare a structurii; operaia de obinere a valorii elementului vizibil, fr eliminarea acestuia din stiv; operaia de verificare dac structura de tip stiv conine sau nu elemente. Unii autori includ n setul de operaii admisibile cu stiva i cele care permit introducerea i extragerea elementelor din interiorul stivei, ns structura pentru care sunt posibile aa operaii nu corespunde definiiei stivei.
SET DE OPERAII CU STIVA Mod de acces: Elementele sunt adugate i eliminate prin vrful stivei. Operaii specifice: INITSTACK(St) Funcia: Iniializeaz stiva (starea - stiva vid). Intrare: Stiva trebuie iniializat. Precondiie:Nici una. Ieire: Stiva (iniializat). Postcondiie: Stiva este vid. EMPTYSTACK (St) Returneaz o valoare de tip boolean Funcia: Indic dac stiva este vid. Intrare: Stiva trebuie testat. Precondiie:Nici una Ieire: EmptyStack (fanion logic). Postcondiie: EmptyStack = (stiva este vid). FULLSTACK (St) Returneaz o valoare de tip boolean Funcia: Indic dac stiva este plin. Intrare: Stiva trebuie testat. Precondiie:Nici una Ieire: FullStack (fanion logic). Postcondiie: FullStack = (stiva este plin). PUSH(St, ElementNou) Funcia: Adaug un element n vrful stivei. Intrare: Stiva, ElementNou. Precondiie:Stiva nu este plin. Ieire: Stiva (Schimbat). Element pus. Postcondiie: Stiva = Stiva original cu ElementNou n vrf. POP(St, ElementScos) Funcia: Elimin elementul din vrful Stivei, i-l returneaz n ElementScos. Intrare: Stiva. Precondiie:Stiva nu este vid. Ieire: Stiva (Schimbat). ElementScos. Postcondiie: Stiva = Stiva original cu elementul din vrf eliminat. ElementScos = elementul din vrf al stivei originale TOP(St, ElVarf) Funcia: Returneaz valoarea elementului din vrful stivei fr modificri. Intrare: Stiva. Precondiie:Stiva nu este vid. Ieire: Valoarea din vrf (Stiva nemodificat) Postcondiie: ElVarf = Valoarea din vrful stivei. Stiva nemodificat

2. Implementarea stivei. Soluie static Pentru implementarea stivei se pot considera soluii statice sau dinamice. Deoarece elementele stivei sunt de acelai tip, vectorul este cea mai rezonabil structur de implementare a stivei.. n acest caz, numrul maxim de elemente ce pot fi memorate n structur este fixat.
Baza [0] Elementele stivei 10 12 7 [1] [2] [3] Vrf 4 [4] Max [100]

Fig. 2 Stiva ca o structur static

Pe lng parametrii obinuii ce descriu un vector, trebuie s avem i o variabil special (indicator) care memorizeaz adresa vrfului stivei. Aceast variabil o vom numi-o simplu "vrf". Acest indicator poate referi primul element liber al stivei sau ultimul element introdus n stiv (este indiferent ce lum n calitate de vrf, principalul s inem minte lucrul acesta la prelucrarea ulterioar a elementelor stivei!). n cele ce urmeaz, vom considera c indicatorul vrfului stivei se refer la primul element liber i crete la introducerea noilor elemente n direcia dimensiunii maxime a structurii.
Inserarea unui element n stiv

Atunci cnd introducem un element n stiv, el se nscrie n locul referit de indicatorul vrf, apoi acest indicator se modific astfel ca s indice urmtoarea poziie liber (dac indicatorul vrf arat la ultimul element introdus, atunci mai nti se modific el, apoi se realizeaz introducerea elementului n stiv). Modificarea indicatorului const n incrementarea lui cu cu o unitate. Inserarea trebuie s fie nsoit de verificarea strii stivei dac stiva nu este plin (dac "avem loc" pentru inserare).
[1] [2] [3] [4]

12

9
Vrf

... ...

Max

[1]

[2] [3] [4] [5]

12

7
Vrf

... ...

Max

Fig. 3 Stiva nainte i dup inserarea unui element Algoritm Inserare n stiv Dac vrf=dimensiunea maxim a stivei Atunci Scrie Eroare stiva este plin! Altfel Incrementeaz vrful; Plaseaz elementul nou n poziia vrfului; Extragerea unui element din stiv

Operaia de extragere din stiv presupune modificarea indicatorului vrf n direcie invers i accesarea elementului din vrf pentru prelucrri ulterioare. Pentru a extrage un element dintr-o stiv, trebuie mai nti s verificm dac exist elemente n stiv (deci dac stiva nu este vid). Dac exist elemente, atunci memorizm elementul din vrf ntr-o variabil, dup care decrementm indicatorul vrf cu o unitate.
[1] [2] [3] [4]

12

9
Vrf

... ...

Max

[1]

[2] [3] [4] [5]

12

3
Vrf

... ...

Max

Fig. 4 Stiva nainte i dup extragerea unui element

Datorit modului su restrictiv de funcionare, stiva permite numai accesarea elementelor de la vrf. Dac dorim s aflm valoarea unui alt element al stivei, ar trebui s extragem succesiv elemente pn la elementul de care avem nevoie i s-l prelucrm. Accesarea presupune determinarea valorii acestuia i plasarea valorii lui ntr-o variabil de lucru (de exemplu ElVrf:=St[varf]).
Algoritm Extragere din stiv Dac vrf=0 {stiva este vida } Atunci Scrie Eroare stiva este vid! Altfel Reine elementul scos ntr-o variabil Decrementeaz vrful stivei

n continuare este prezentat un Unit care realizeaz operaiile specifice cu stive implementate static.
unit staticst; interface const max=100; { dimensiunea maxima a stivei } type index=0..max; tipelement=integer; { poate fi oricare } stiva=array[index] of tipelement; var st:stiva; varf:index; procedure initstack(var st:tipstiva); function emptystack(st:stiva):boolean; function fullstack(var st:stiva):boolean; procedure push(var st:stiva; elemnou:tipelement); procedure pop(var st:stiva; var elemscos:tipelement); procedure top(var st:stiva; var elvarf:tipelement); implementation procedure initstack(var st:tipstiva); begin varf:=0; end; function emptystack(st:stiva):boolean; begin emptystack:=varf=0; end; function fullstack(var st:stiva):boolean; begin fullstack:=varf=max; end; procedure push(var st:stiva; elemnou:tipelement); var plina:boolean; begin plina:=fullstack(st); if plina then begin writeln('stiva e plina, nu se pot pune elemente in ea!'); halt end else begin varf:=varf+1; st[varf]:=elemnou; end; end;

procedure pop(var st:stiva; var elemscos:tipelement); var vida:boolean; begin vida:=emptystack(st); if vida then begin writeln('stiva e vida, nu se pot scoate elemente din ea!'); halt end else begin elemscos:=st[varf]; varf:=varf-1; end; end; procedure top(var st:stiva; var elvarf:tipelement); begin if not emptystack(st)then elvarf:=st[varf]; end; end.

Dac intenionm s realizm o stiv astfel ca indicatorul vrf s se schimbe n direcia micorrii adreselor (indicatorul vrf arat la primul element liber), atunci operaiile de baz se vor scrie astfel:
procedure initstack(var st:tipstiva); begin varf:=max; end; function emptystack(st:stiva):boolean; begin emptystack:=varf=max; end; function fullstack(var st:stiva):boolean; begin fullstack:=varf=0; end; procedure push(var st:stiva; elemnou:tipelement); var plina:boolean; begin plina:=fullstack(st); if plina then begin writeln('stiva e plina, nu se pot pune elemente in ea!'); halt end else begin st[varf]:=elemnou; varf:=varf-1; end; end; procedure pop(var st:stiva; var elemscos:tipelement); var vida:boolean; begin vida:=emptystack(st); if vida then begin writeln('stiva e vida, nu se pot scoate elemente din ea!'); halt end else begin varf:=varf+1; elemscos:=st[varf]; end; end; procedure top(var st:stiva; var elvarf:tipelement); begin if not emptystack(st) then elvarf:=st[varf+1]; end;

3. Implementarea stivei. Soluie dinamic Pentru implementarea stivelor se pot utiliza soluii mai flexibile bazate pe structuri dinamice de date i anume pe baza unei liste simplu nlnuite. Def. O stiv dinamic este o list liniar simplu nlnuit de un tip special, n care adugarea sau scoaterea unui element se face la un singur capt al listei, numit vrful stivei. Elementul introdus primul n list poart numele de baz a stivei. Informaia de legtur a fiecrui element din stiv reprezint adresa elementului pus anterior n stiv, excepie fcnd baza a crei informaie de legtur este nil . Operaiile care se aplic stivelor sunt aceleai ca i pentru soluia static bazat pe un tablou. Efectele procedurilor i funciilor prezentate n urmtoarea implementare dinamic sunt: Iniializare stiv (clearstack) Procedura iniializeaz poziia vrfului stivei ntr-o nregistrare rezervat de ctre aplicaie. Test stiva vid (emptystack) Funcia verific dac mai exist elemente n stiv. Introduce n stiv (push) Procedura introduce un nou element n stiv. Extrage din stiv (pop) Procedura extrage din stiv un element. Valoarea indicatorului (referinei) ctre elementul care a fost scos din stiv se salveaz ntr-un argument al funciei. Valoare din vrf (top) Procedura atribuie unui parametru valoarea pointerului ctre elementul aflat n vrful stivei.
Unit dinamst; interface type tipelement=integer; stiva=^nodst; nodst=record info:tipelement; next:stiva; end; var st:stiva; procedure initstack (var st:stiva); function emptystack (st:stiva):boolean; procedure push (var st:stiva; elemnou:tipelement); procedure pop (var st:stiva; var elemscos:tipelement); procedure top (var st:stiva; var virf:nod); implementation procedure clearstack (var st:stiva); begin st:= nil; end; function emptystack (st:stiva):boolean; begin emptystack =(st=nil); end; procedure push (var st:stiva; elemnou:tipelement); var nodnou:stiva; begin new(nodnou); nodnou^.info:=elemnou; nodnou^.next:=st; st:= nodnou; end;

procedure pop (var st:stiva; var elemscos:tipelement); var temp:stiva; begin if not emptystack(st) then begin elemscos:= st^.info; temp:=st; st:=st^.next; dispose(temp); end; end; procedure top (var st:stiva; var virf:nod); begin if not emptystack(st) then virf:= st^.info; end; end.

n figurile din continuare, se ilustreaz operaia de punere pe stiv a unui nod, respectiv scoaterea unui nod din stiv.

Efectul procedurii PUSH


St Vrf

4
NodNou

3 ?

1 NIL

?
St Vrf

1. NEW(NodNou);

4
NodNou

3 ?

1 NIL

5
St Vrf

2. NodNou^.Info:=ElemNou;

4
NodNou

1 NIL

3. NodNou^.Next:=St; St:=NodNou;

Efectul procedurii POP


St Vrf

5 5
ElScos St

1 NIL

1. ElScos:=St^.Info;

Vrf

5
Temp

1 NIL

2. Temp:=St; St:=St^.Next; Dispose(Temp);

4. Aspect aplicativ Problem: Se citete un ir de caractere de la tastatur, care se termin cu spaiu liber (blanc). De afiat irul de caractere n ordine invers. Algoritmul rezolvrii poate fi implementat sub forma unei proceduri Revers n cadrul creia se apeleaz procedurile descrise n unit-ul StaticSt (InitStack, Push, Pop i funcia EmptyStack).
procedure revers; { inverseaza un sir } const blanc=' '; var ch:char; stiva:tipstiva; begin initstack(stiva); repeat read(ch); if ch<>blanc then push(stiva,ch); until ch=blanc; while not emptystack(stiva) do begin pop(stiva,ch); write(ch,' '); end; end;

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