Documente Academic
Documente Profesional
Documente Cultură
A. LISTE STATICE
1. Stiva
Stiva este un caz particular al listei, pentru care se păstrează principiul de funcţionare
LIFO, adică, ultimul element intrat în listă este şi primul element extras din listă. De remarcat
este faptul că, în cazul stivei, atât operaţia de adăugare, cât şi cea de extragere, se efectuează
printr-un acelaşi cap.
Stiva poate fi de două feluri:
1) Statică, adică, pe vector
2) Dinamică, adică, înlănţuită
#include<iostream>
using namespace std;
#define dim 30 //dimensiunea stabilita maximal pentru vector
typedef int stiva[dim]; // s-a construit un tip de date, cu numele 'stiva', dupa
dimensiunea stabilita anterior
//functie de testare daca stiva este ocupata, adica, are toata memoria rezervata
int full()
{
if(vf==dim)
return 1;
return 0;
}
1
cout<<"Stiva este plina. Nu se mai pot face adaugari\n";
return;
}
st[vf++]=e; //se mai putea scrie si asa: {st[vf]=e; vf++;}
}
e=pop();
cout<<"Elementul extras este: "<<e<<". ";
write();
e=pop();
cout<<"Elementul extras este: "<<e<<". ";
write();
e=pop();
system("pause");
return (0);
}
2
2. Coada
Coada este un caz particular al listei, pentru care se păstrează principiul de funcţionare
FIFO, adică, primul element intrat în listă este şi primul element extras din listă. De remarcat
este faptul că, în cazul stivei, operaţiile de adăugare şi extragere se efectuează cele două capete
diferite ale sale.
Coada poate fi de două feluri:
1) Statică, adică, pe vector
2) Dinamică, adică, înlănţuită
#include<iostream>
using namespace std;
#define dim 30 //dimensiunea stabilita maximal pentru vector
typedef int coada[dim]; // s-a construit un tip de date, cu numele 'coada', dupa
dimensiunea stabilita anterior
//functie de testare daca coada este ocupata, adica, adre toata memoria rezervata
int full()
{
if(vf==dim)
return 1;
return 0;
}
3
{
if(empty()!=0)
{
cout<<"Coada este goala. Nu se mai pot face extrageri\n";
return 0;
}
int e=cd[0]; //elementul ce va fi extras din coada
for(int i=0;i<vf-1;i++)
cd[i]=cd[i+1];
vf--; //reduc numarul de elemente ca acel ultim element sa nu apara de 2 ori
return e; //se extrage primul element din coada
}
e=pop();
cout<<"Elementul extras este: "<<e<<". ";
write();
e=pop();
cout<<"Elementul extras este: "<<e<<". ";
write();
e=pop();
system("pause");
return (0);
}
4
B. LISTE DINAMICE
1. Stiva
//3. Stiva inlantuita (in cazul de fata am optat pentru urmatoarea
prelucrare: stiva este o lista pentru care atat operatia de adaugare, cat sic
ea de extragere se efectueaza prin fata listei)
#include<iostream>
using namespace std;
typedef struct nod stiva; //constructia unui tip de date, numit stiva, pentru operatiile
de tipul nod, definite mai sus
5
vf=vf->next; //noul varf din fata al listei
delete temp; //sau: free(temp); - curatim vechiul varf al listei
}
return vf;
}
//functia principala
int main()
{
stiva* vf=NULL; //initializarea listei
vf=push(vf,7);
write(vf);
vf=push(vf,4);
write(vf);
vf=pop(vf);
write(vf);
vf=pop(vf);
write(vf);
system("pause");
return (0);
}
OBS: Dacă stiva este un caz perticular de listă pentru care atât operaţia de adăugare, cât şi cea de
extragere, se efectuează prin acelaşi cap, în cazul cozii, aceasta este o listă, pentru care operaţia de
adăugare presupune introducerea unui nou element prin spatele listei şi extragerea prin faţa listei.
6
2. Coada
//4. Coada ca si lista inlantuita
#include<iostream>
using namespace std;
typedef struct nod coada; //constructia unui tip de date, numit COADA, pentru operatiile
de tipul nod, definite mai sus
7
return vf;
}
//functia principala
int main()
{
coada* vf=NULL; //initializarea listei
vf=push(vf,7);
write(vf);
vf=push(vf,4);
write(vf);
vf=pop(vf);
write(vf);
vf=pop(vf);
write(vf);
system("pause");
return (0);
}
OBS: Dată fiind diferenţa dintre cele două cazuri particulare de listă, problema rezolvării stivei, respectiv,
a cozii, difera doar prin funcţia de adăugare, (în cazul de mai sus), care presupune adăugarea prin faţa
listei, dacă şi extragerea se va face tot prin faţa listei, în cazul stivei, respective, prin spatele listei, iar,
extragerea prin faţa listei, în cazul cozii.
8
C. ARBORELE DE CĂUTARE BINARĂ (BINARY SEARCH TREE)
Foarte important în căutare şi sortare, este arborele de căutare binară. Un arbore de căutare
binară este un arbore binar vid sau în care fiecare nod conţine o cheie (informaţie importantă după care
se face ordonarea) ce satisface următoarele condiţii:
i) toate cheile din subarborele stâng(dacă există) preced cheia din rădăcină;
ii) cheia din rădăcină precede toate cheile din subarborele drept(dacă există);
iii) subarborii stâng şi drept sunt la rândul lor arbori de căutare.
Observaţie
E 4 M
D 1 1 D P
C 3 9 1 A F S
A 2 I R Z
1 B E
a b c
#include<iostream>
using namespace std;
#define max(x,y) ((x<y)?(y):(x))
9
//inserarea unui nou element in arbore
arbore* inserare(arbore* bt, int e)
{
//testarea daca arborele este gol
if (!bt)
{
bt=new(arbore); //sau: bt=(arbore*)malloc(sizeof(arbore));
if (!bt) //situatia in care alocarea de memorie nu reuseste
{
cout<<"Alocare de memorie esuata\n";
return NULL;
}
//introducerea informatiei in nodul arborelui
bt->info=e;
/*fiind doar un prim element introdus in arbore, subarborii stang si drept
vor fi pozitionati pe NULL*/
bt->left=bt->right=NULL;
}
else //situatia in care arborele mai continea si alte elemente
if(bt->info>e) /*verificam daca valoarea din radacina este mai mare ca cea
nou venita*/
bt->left=inserare(bt->left,e); /*daca valoarea nou intrata este mai
mica decat cea din radacina, pozitionarea se va face in stanga acesteia*/
else
bt->right=inserare(bt->right,e); /*daca valoarea nou intrata este
mai mare decat cea din radacina, pozitionarea se va face in dreapta acesteia*/
return bt;
}
/* modul 1: traversarea in preordine, adica: mai intai se viziteaza nodul radacina, apoi
subarborele stang, apoi cel drept (RSD)
- in exemplul de mai sus: 7 2 4 3 5 9 */
void preordine(arbore *bt)
{
if(bt!=NULL)
{
cout<<bt->info<<' ';
preordine(bt->left);
preordine(bt->right);
}
}
10
/* modul 2: traversarea in inordine, adica: traversarea subarborelui stang, a radacinii
si apoi a celui drept (SRD)
- in exemplu: 2 3 4 5 7 9 . Dupa cum se poate observa rezultatul va da o lista
sortata */
void inordine(arbore *bt)
{
if (bt!=NULL)
{
inordine(bt->left);
cout<<bt->info<<' ';
inordine(bt->right);
}
}
11
return frunze(bt->left)+frunze(bt->right);
}
/********************************************************/
system("pause");
return 0;
}
12