Sunteți pe pagina 1din 16

Universitatea Valahia din Trgovite Facultatea de Inginerie Electric Specializarea: Electrotehnic Anul I

PROIECT
la Programarea Calculatoarelor i Limbaje de Programare II

Student: Crciun Radu Ioan

2010

Tema:

Structuri de date. Stiva i coada

Cuprins
1. Stiva definitie ...................................................................................................4 2. Utilitatea stivelor ................................................................................................4 3. Implementarea unei stive ....................................................................................5 4. Coada definitie .................................................................................................7 5. Utilitatea unei cozi ..............................................................................................7 6. Implementarea unei cozi .....................................................................................8 Bibliografie ...........................................................................................................16

1. Stiva definitie

Stiva este o structura de date abstracta pentru care atat operatia de inserare a unui element cat si operatia de extragere a unui element se realizeaza de la un singur capat,denumit varful stivei. Elementele componente ale structurii de tip stiva sunt de acelasi tip, ceea ce inseamna ca stiva este o structura de date omogena. Singurul element din stiva la care avem acces direct este cel de la varf.

Operatii caracteristice : crearea unei stive vide inserarea unui element in stiva(operatie denumita si PUSH) extragerea unui element din stiva(operatie denumita si POP) accesarea elementului de la varf(operatie de numita si TOP) Ca sa ne imaginam mai bine functionarea unei stive,sa ne gandim cum lucram cu un teanc de carti foarte inalt.Cand dorim sa punem o carte in teanc,o punem deasupra,cand dorim sa luam o carte o luam tot pe cea de deasupra.Motivul este clar de inteles : daca am lua o carte de la mijloc am risca sa daramam tot teancul sau nu am putea ridica cartile de deasupra pentru ca ar fi prea grele. Din acest motiv,stiva este definita si ca o structura de date ce functioneaza dupa principiul LIFO ( last in first out).

2. Utilitatea stivelor
Stiva este necesara pentru memorarea unor informatii si regasirea acestora intr`o anumita ordine,descrisa de principiul LIFO.Stiva este folosita atunci cand programul trebuie sa amane executia unor operatii,pentru a le executa ulterior,in ordinea inversa a aparitiilor lor.Un bun exemplu de utilizare a stivelor il reprezinta evaluarea unor expresii matematice(prin aducerea unei expresii matematice la forma poloneza,spre exemplu).

3. Implementarea unei stive


Stiva este o structura de date abstracta,ce poate fi implementata in diverse moduri.De exemplu,putem implementa o stiva ca un vector in care retinem elementele stivei.Pentru ca acest vector sa functioneze ca o stiva,singurele operatii admise sunt cele caracteristice stivei. Declaratiile necesare pentru implementarea unei stive de tip intreg. Code: #define MAX_N 200 // numarul maxim de element din stiva typedef int stiva[MAX_N]; stiva S; //stiva int vf; //varful stivei Crearea unei stive vide Pentru a crea o stiva vida initializam varful stivei cu -1(varful stivei indica intotdeauna pozitia ultimului element,elementele fiind memorate de pe pozitia 0). Code: vf = -1; Inserarea unui element in stiva Pentru a insera un element in e in stiva S trebuie sa verificam in primul rand daca stiva nu este plina. Daca acest lucru este indeplinit memoram elementul,in caz contrar nu putem duce la indeplinirea sarcinii. Code: if(vf == MAX_N-1) //daca stiva este plina cout<<"Stiva este plina,nu am putut insera elementul.\n"; else S[++vf] = e; //inseram elementul e in stiva Extragerea unui element din stiva Pentru a extrage un element din stiva trebuie sa ne asiguram ca stiva nu este vida.Daca nu este,atunci retinem valoarea din varful stivei intr`o variabila e si decrementam varful. Code: if(vf < 0) // daca stiva este vida cout<<"Stiva este vida,nu am putut extrage valoarea.\n"; else e = S[vf--]; 5

Accesarea elementului de la varf Accesarea elementului de la varf presupune determinarea valorii acestuia,,valoare pe care noi o vom retine intr`o variabila denumita e. Code: e = S[vf]; Toate inserarile (push) si extragerile (pop) sunt realizate la acelasi capat al structurii de implementare, denumit varful stivei. In exemplul de mai jos, sunt prezentate implementari ale operatiilor push si pop, utilizand ca structura de implementare lista simpla [...]. Structura elementelor stivei este formata dintr-o valoare de tip int si adresa urmatorului element din structura. struct Nod { int val; Nod* next; } Nod* push(Nod* vf, int v) { Nod* nou=new Nod; nou->val=v; nou->next=vf; return nou; } Nod* pop(Nod* vf, int *v) { if(vf) { *v=vf->val; Nod* t=vf; vf=vf->next; delete t; return vf; } return vf;

4. Coada definitie
Coada este o structura de date abstracta pentru care operatia de inserare a unui element se realizeaza de la un capat,in timp ce operatia de extragere a unui element se realizeaza de la celalalt.

Operatii caracteristice crearea unei cozi vide inserarea unui element in coada extragerea unui element din coada accesarea unui element Executarea acestor operatii asupra unei cozi necesita cunoasterea inceputului(inc) si a sfarsitului acesteia(sf).

Modul de functionare a unui cozi este foarte usor de intuit : cred ca toata lumea a stat la coada,macar o data.Orice situatie in care sunt mai multe cereri de acces la o resursa unica,necesita formarea unei "linii de asteptare".Cererile trebuie sa fie efectuate in ordinea sosirii. Datorita acestui lucru,putem spune ca o coada functioneaza dupa principiul FIFO(first in first out).

5. Utilitatea unei cozi


Utilitatea structurii de tip coada reiese din modul sau de functionare,este necesara utilizarea unei cozi atunci cand informatiile trebuie prelucrate exact in ordinea in care au fost retinute in coada. Un bun exemplu de folosire a unei cozi il reprezinta imprimanta,cand un utilizator face mai multe cereri de imprimare in acelasi timp,ele sunt memorate intr`o coada de tiparireQueue.Imprimanta le va tipari in ordinea in care vor aparea.

6. Implementarea unei cozi

Coada este o structura de date abstracta care poate fi implementata,ca si in cazul stivei,in diferite moduri.In exemplu de mai jos o vom implementa static,retinand elementele intr`un vector. Declaratiile necesare pentru implementarea unei cozi de tip intreg. Code: #define MAX_N 200 //numarul maxim de elemente din coada typedef int coada[MAX_N]; coada C; //coada int inc,sf; //inceputul si sfarsitul cozii Elementele cozii sunt memorate in vector de la pozitia inc pana la pozitia sf,deci numarul lor este : sf-inc+1. Crearea unei cozi vide Code: inc = 0; sf = -1; Inserarea unui element in coada Code: if(sf == MAX_N - 1) //numai avem spatiu cout<<"Coada este plina.\n"; else C[++sf] = e; //inseram elementul e in coada C Extragerea unui element din coada Code: if(inc > sf) //coada este vida cout<<"Coada este vida.\n"; else e = C[inc++]; //extragem primul element Accesarea unui element Code: e = C[inc];

Coada circular Se observa ca in acest mod,pe masura ce inseram si extragem elemente,atat sfarsitul,cat si inceputul cozii tind catre limita maxima a vectorului.Dezavantajul este ca in vector raman pozitii neutilizate(de la 0 pana la inc-1). De exemplu,am putea avea o situatie in care coada contine un singur element,dar operatia de inserare sa nu fie posibila pentru ca inc = sf = MAX_N-1. O solutie care ar rezolva aceasta situatie ar fi reutilizarea spatiului alocat cozii circular. Pentru aceasta,urmatoarea pozitie dupa pozitia inc poate fi : inc + 1,daca inc < MAX_N -1; 0 , daca i = MAX_N -1 Concis : (i+1)%DimMax.

Att n implementarea statica (programul Static_Coada) ct si n implementarea dinamica (programul Dinamic_Coada), o coada e determinata de:

capul cozii (arata locul de unde se extrage); coada cozii (arata locul unde se adauga); lungimea cozii (numarul elementelor din coada). Grafic, pentru o coada cu lungimea n=4 elementele, cele doua variante de

implementare pot arata astfel:

Variante de implementare a cozii.

a) varianta statica

b) varianta dinamica

Lista programului Static_Coada (implementarea statica) este prezentata n continuare. Program Static_Coada; const max_aloc=20; var coada:array[1..max_aloc] of integer; ch:char; n,x,pcap,pcoada:integer; cod:boolean; procedure InitCoada; begin .. .pcap:=1; .. .pcoada:=1; .. .n:=0 end; procedure AdaugaEl(x:integer;var cod:boolean); begin ... if n>=max_aloc then ...cod:=false ...else ...begin .. coada[pcoada]:=x;

......pcoada:=(pcoada+1) mod max_aloc; ......if pcoada=0 then .........pcoada:=max_aloc; ......n:=n+1; .....cod:=true ...end end; procedure ExtragEl(var x:integer;var cod:boolean); begin ...if n=0 then ......cod:=false 10

...else ...begin ......x:=coada[pcap]; ......pcap:=(pcap+1) mod max_aloc; ......if pcap=0 then .........pcap:=max_aloc; ......n:=n-1; ......cod:=true ...end end; procedure Listare; var ...i:integer; begin ...writeln('Elementele cozii sint:'); ...if pcap<pcoada then ......for i:=pcap to pcoada-1 do .........writeln(coada[i]:3) ...else ...begin ......for i:=pcap to max_aloc do .........writeln(coada[i]:3); ......for i:=1 to pcoada-1 do .........writeln(coada[i]:3) ...end end; begin {program principal} ...repeat ......writeln('I.Initializare coada'); ......writeln('A.Adauga element in coada'); ......writeln('E.Extrage element din coada'); ......writeln('L.Listare elemente coada'); ......writeln('S.Sfirsit program'); ......write('Optiunea dvs. va rog:');readln(ch); 11

......case upcase(ch) of ......'I':InitCoada; ......'A':begin .........write('Valoarea de adaugat =');readln(x); .........AdaugaEl(x,cod); .........if cod then ............Listare .........else ............writeln('Dimensiune alocare coada insuficienta!') .........end; ......'E':begin .........ExtragEl(x,cod); .........if cod then ............writeln('S-a extras elementul',x:3) .........else ............writeln('Coada vida!') .........end; ......'L':Listare ......end; ......readln ...until ch in ['S','s'] end {Static_Coada}.

Lista programului Dinamic_Coada (implementarea dinamica) este prezentata mai jos. Program Dinamic_Coada; type ...pstruct=^struct; ...struct=record ...util:integer; ...urm:pstruct end; var ...p,prim,ultim:pstruct; 12

...ch:char; ...x,n:integer; ...cod:boolean; procedure InitCoada; begin ...prim:=nil; ...ultim:=nil; ...n:=0 end; procedure AdaugaEl(x:integer;var cod:boolean); begin ...if sizeof(struct)<maxavail then ...begin ......new(p); ......p^.util:=x; ......p^.urm:=nil; ......if prim=nil then ......begin .........prim:=p; .........ultim:=p ......end ......else ......begin .........ultim^.urm:=p; .........ultim:=p ......end; ......cod:=true; ......n:=n+1 ...end ...else ......cod:=false end; procedure ExtragEl(var x:integer;var cod:boolean); begin 13

...if prim=nil then ......cod:=false ...else ...begin ......if prim=ultim then .........ultim:=nil; ......x:=prim^.util; ......p:=prim; ......prim:=prim^.urm; ......dispose(p); ......cod:=true; ......n:=n-1 ...end end;

procedure Listare; begin ...writeln('Elementele cozii sint:'); ...p:=prim; ...while p<>nil do ...begin ......write(p^.util:3); ......p:=p^.urm ...end end; begin {program principal} ...repeat ......writeln('I.Initializare coada'); ......writeln('A.Adauga element in coada'); ......writeln('E.Extrage element din coada'); ......writeln('L.Listare elemente coada'); ......writeln('S.Sfirsit program'); ......write('Optiunea dvs. va rog:');readln(ch); ......case upcase(ch) of 14

......'I':InitCoada; ......'A':begin .........write('Valoarea de adaugat='); .........readln(x); .........AdaugaEl(x,cod); .........if cod then ............Listare .........else .........begin ............write ('Memorie disponibila)

15

BIBLIOGRAFIE

1. 2.

Du, L., Note de curs; Odgescu I., Furtun F., Metode i tehnici de programare, Editura Computer Schildt H., C ++ Manual Complet, Editura Teora, Bucureti, 2000 Tudor S., Tehnici de programare, Editura L & S Infomat, Bucureti, 1996

Libris Agora, Cluj Napoca; 3. 4.

Surse internet *** http://www.itcsolutions.eu/2009/11/10/structurile-de-date-stiva-si-coada/ *** http://eureka.cs.tuiasi.ro/~sarustei/SDA/Lab4.pdf *** http://ro.wikipedia.org/wiki/Structur%C4%83_de_date

16

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