Sunteți pe pagina 1din 22

Structuri de tip stiv.

Structura de tip stiv


Aceast structur de date este un caz particular de list
care funcioneaz pe principiul LIFO (last in first out,
ultimul intrat este primul ieit). Prin urmare principalele
prelucrri care se refer la aceast structur de date vor fi:
creare stiva
listare stiva (parcurgere n ordine invers crerii)
adugare la sfrit (peste vrful stivei, operaie
numitpush ( ))
tergere element din vrful stivei (operaie
numitpop( ))
prelucrarea vrfului stivei

Ca s ne imaginm mai bine funcionarea unei stive, s


ne gndim cum lucrm cu un teanc de farfurii. Cnd
dorim s punem o farfurie n teanc, o punem deasupra,
cnd dorim s lum o farfurie din teanc, o lum tot pe cea
de deasupra. Motivul este lesne de neles: nu ne-am
propus s spargem farfuriile!
Acest mod de funcionare face ca ultimul element inserat
n stiv s fie primul extras. Din acest motiv, stiva este
definit i ca o structur de date care funcioneaz dup
principiul LIFO (Last In First Out Ultimul Intrat Primul
Ieit).

Care este utilitatea stivelor?


n informatic stiva joac un rol fundamental. Pentru a
nelege mecanisme fundamentale ale programrii (de
exemplu, funciile sau recursivitatea) este necesar
cunoaterea noiunii de stiv.
Pe scurt, stiva este util n situaii n care este necesar
memorarea unor informaii i regsirea acestora ntr-o
anumit ordine, descris de principiul LIFO. Stiva este
utilizat atunci cnd programul trebuie s amne execuia
unor operaii, pentru a le executa ulterior, n ordinea
invers a apariiei lor. Operaia curent este cea
corespunztoare vrfului stivei, n stiv fiind reinute toate

Cum implementm o stiv?


Stiva este o structur de date abstract, ce poate fi
implementat n diferite moduri. De exemplu, putem
implementa o stiv ca un vector n care reinem elementele
stivei. Pentru ca acest vector s funcioneze ca o stiv, singurele
operaii permise sunt operaiile caracteristice stivei. Pentru
exemplificare, s prezentm declaraiile necesare pentru
implementarea unei stive cu elemente de tip int:
#define DimMax 100
//numarul maxim de elemente din stiva
typedef int Stiva[DimMax];
//tipul Stiva implementat ca vector
Stiva S;
//stiva
int
vf;
//varful stivei

Crearea unei stive vide


Pentru a crea o stiv vid iniializm vrful stivei cu
-1 (vrful stivei indic ntotdeauna poziia ultimului
element introdus n stiv; elementele sunt memorate n
vector ncepnd cu poziia 0):
vf=-1;

Inserarea unui element n stiv


Pentru a insera un element x n stiva S trebuie s
verificm n primul rnd dac avem loc, deci dac
stiva nu este plin. Dac stiva este plin, inserarea
nu se poate face, altfel vom mri vrful stivei i vom
plasa la vrf noul element. De exemplu, dac dorim
s inserm elementul x = 3 n stiva din figura
urmtoare, obinem:

Stiva S nainte de inserare

Stiva S dup inserare

if (vf == DimMax-1)

//stiva este plina

cout<<"Eroare - stiva este plina\n";


else

//inseram elementul x in stiva S

S[++vf] = x;

Extragerea unui element din stiv


Pentru a extrage un element dintr-o stiv S trebuie s verificm
n primul rnd dac exist elemente n stiv (deci dac stiva
nu este vid). Dac da, reinem elementul de la vrful stivei
ntr-o variabil (s o notm x), dup care micorm cu o unitate
vrful stivei. De exemplu, dac extragem un element din stiva din
figura urmtoare, obinem:

Stiva S nainte de extragere

Stiva S dup extragere

if (vf<0)
//stiva este vida
cout<<"Eroare - stiva este vida\n";
else
//extragem elementul de la varf
x = S[vf--];

Accesarea elementului de la vrf


Prin modul su restrictiv de funcionare, stiva permite
numai accesarea elementului de la vrf. Dac dorim s
aflm valoarea unui alt element al stivei, ar trebui s
golim stiva (deci s extragem succesiv elemente)
pn la elementul dorit. Accesarea elementului de la
vrf presupune determinarea valorii acestuia, valoare
pe care noi o vom reine ntr-o variabil denumit x.
x = S[vf];

Observaii
1. Dezavantajul implementrii unei stive ca vector alocat
static const n faptul c indiferent de numrul de
elemente existente n stiv, dimensiunea zonei de
memorie alocat stivei este aceeai (DimMax).
2. Pentru a executa operaii cu stiva alocat static
este suficient s cunoatem vrful stivei. Ca s reinem
mai uor modul de funcionare a stivei, ne imaginm c
la inserare vrful stivei urc, iar la extragere vrful
coboar.

Stiva implementat dinamic


Cum a mai fost menionat la nceputul prezentrii stiva
este un caz particular de list, mai specific o list simplu
nlnuit. Deci poate fi implementat ca una.
struct nod{
int info;
nod *back;
};

Specific acestei structuri de date este faptul c


prelucrrile se fac ntotdeauna la elementul de la acelai
capt, element pe care l vom numi vrf.
Funciapush( ), creaz stiva cnd aceasta este vid
sau adaug un nou element n caz contrar.
Funciapop( ),elimin elementul din vrful stivei.
Fie o stiv de numere ntregi pentru care elementele sunt
adugate n ordinea: 10,20,30,40

La primul pas se creaza stiva caz in care primul element


creat va fi varful stivei:
Apoi se adauga prin operatia push ( ) un nou element,
20:
Astfel 20 devine noul varf

In continuare se adauga 30 care va deveni noul varf:

La sfarsit se adauga 40:

Afisarea se va face in ordine inversa generarii si prin


urmare se va afisa: 40,30,20, 10.

Pentru stergere, prin operatia pop( ) se va sterge


elementul din varful stivei, 40,dupa care noul varf va
deveni precedentul sau, 30:

Creare i adugare n stiv push()


void push(nod* &v,int x){
nod *c;
if(!v){
v=new nod;
v->info=x;
v->back=0;
}
else{
c=new nod;
c->back=v;
c->info=x;
v=c;
}
}

Extragere din stiv


void pop(nod* &v){
nod* c;
if(!v) cout<<"stiva este vida si nu mai ai ce
elimina!!!";
else{
c=v;
v=v->back;
delete c;
}
}

Stiv implementat dinamic exemplu

#include<iostream>
using namespace std;
struct nod{
int info;
nod *back;
};
nod *varf;
//Creare stiva/adaugare in stiva
void push(nod* &v,int x){
nod *c;
if(!v){
v=new nod;
v->info=x;
v->back=0;
}
else{
c=new nod;
c->back=v;
c->info=x;
v=c;
}
}
//Eliminare din stiva
void pop(nod* &v){
nod* c;
if(!v) cout<<"stiva este vida si nu mai ai ce elimina!!!";
else{
c=v;
v=v->back;
delete c;
}
}
//afisarea stivei
void afisare(nod *v){
nod *c;
c=v;
while(c){
cout<<c->info<<" ";
c=c->back;
}
}

main(){
int n,nre,a,i;
cout<<"numarul initial de noduri ";
cin>>n;
for(int i=1;i<=n;i++){
cout<<"valoarea de adaugat in stiva ";
cin>>a;
push(varf,a);
}
cout<<endl;
afisare(varf);
cout<<endl<<"cate eliminari ?";
cin>>nre;
for(i=1;i<=nre;i++) pop(varf);
cout<<endl<<"dupa eliminare"<<endl;
n=n-nre;
cout<<"stiva are "<<n<<" elemente"<<endl;
afisare(varf);
//prelucrez varful stivei: de exemplu se poate dubla continutul:
varf->info=2*varf->info;
cout<<endl<<"dupa dublarea valorii varfului "<<endl;
afisare(varf);
}

Pentru acas
S se memoreze n numere ntregi ntr-o structur de tip
stiva. S se tearga elementele din vrful stivei pn se
ntlnete un numr pentru care suma cifrelor este mai
mare dect 10.

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