Documente Academic
Documente Profesional
Documente Cultură
Vom
parcurge urmatoarele etape.
1. Stiva - definitie
2. Utilitatea stivelor
3. Implementarea unei stive
* Crearea unei stive vide
* Inserarea unui element in stiva
* Extragerea unui element din stiva
* Accesarea elementului de la varf
4. Coada - definitie
5. Utilitatea unei cozi
6. Implementarea unei cozi
* Crearea unei cozi vide
* Inserarea unui element in coada
* Extragerea unui din coada
* Accesarea unui element
* Stiva circulara
7. Aplicatii
8. Exercitii
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.
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).
Code:
#define MAX_N 200 // numarul maxim de element din stiva
typedef int stiva[MAX_N];
stiva S; //stiva
int vf; //varful stivei
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
Code:
if(vf < 0) // daca stiva este vida
cout<<"Stiva este vida,nu am putut extrage valoarea.\n";
else
e = S[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).
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.
Code:
if(sf == MAX_N - 1) //numai avem spatiu
cout<<"Coada este plina.\n";
else
C[++sf] = e; //inseram elementul e in coada C
Code:
if(inc > sf) //coada este vida
cout<<"Coada este vida.\n";
else
e = C[inc++]; //extragem primul element
* Coada circulara
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.
7. Aplicatii
Paranteze
Se citeste pe o linie de la tastatura o succesiune de paranteze rotunde deschise si inchise,pana la
intalnirea caracterului '.'. Verificati daca parantezele din sirul citit se inchid corect.
Exemple :
1.paranteze.in
Code:
(()).
paranteze.out
Code:
Parantezele se inchid corect.
2.paranteze.in
Code:
((().
paranteze.out
Code:
Parantezele nu se inchid corect.
3.paranteze.in
Code:
(().
paranteze.out
Code:
Parantezele nu se inchid corect.
Solutie
Vom citi sirul de intrare caracter cu caracter pana la intalnirea caracterului '.'.Pentru fiecare caracter
verificam daca este paranteza deschisa sau inchisa.Daca e paranteza deschisa inseram in coada,iar
daca este paranteza inchisa extragem un element din coada (daca este posibil,daca nu rezulta ca sirul
nu este o expresie corecta).
Dupa citirea intregului sir verificam daca mai sunt elemente in coada,daca raspunsul e afirmativ
inseamna ca sirul este o expresie gresita.
Code:
#include<stdio.h>
int main()
{
char c;
freopen("paranteze.in","r",stdin);
freopen("paranteze.out","w",stdout);
fclose(stdin); fclose(stdout);
return 0;
}
8. Exercitii
1.Modificati solutia de mai sus si calculati dimensiunea maxima a cozii(numarul maxim de paranteze
deschis retinute in coada la un moment dat).
2.Labirint
Se da un labirint dreptunghiular de dimensiuni n X m(n,m <= 100).Pozitiile din stanga sus si din
dreapta jos sunt marcate cu 0,celelalte contin unul dintre numerel 1,2,3,4.Scopul este de a parcurge
labirintul din coltul stanga sus pana la coltul din dreapta jos,pe un drum de lungime minima,pe directii
paralele cu laturile sale.Drumul urmat trebuie sa plece din 0 in 1,apoi din 1 in 2,din 2 in 3,din 3 in
4,din 4 in 1 etc.Se poate ajunge in pozitia finala din oricare pozitie vecina ei.
Din fisierul de intrare INPUT.TXT se vor citi de pe prima linie numerele intregi n si m,care reprezinta
dimensiunile labirintului,iar de pe urmatoarele n linii cate m numere intregi,separate prin cate un
spatiu,reprezentand labirintul.In fisierul de iesire OUTPUT.txt se va afisa pe prima linie numarul minim
de pasi,iar pe cea de`a doua linie,un sir de caractere ce reprezinta succesiunea de miscari de pe cel
mai scurt drum din labirint folosind codificarea : D(jos),U(sus),L(stanga),respectiv R(dreapta).
Exemplu
Input.txt
Code:
5 4
0 1 2 3
3 2 1 4
4 1 2 1
1 4 3 2
2 3 4 0
output.txt
Code:
7
RRRDDDD