Sunteți pe pagina 1din 5

LISTE

Lista liniară este o structură de date logică, cu date omogene, în care fiecare element are
exact un element predecesor și exact un element succesor, cu excepția primului și al ultimului
element.

Elementele unei liste se mai numesc noduri. Lungimea unei liste reprezintă numărul de
noduri din listă. O lista care nu are niciun element se numește listă vidă.

Asupra listei se pot executa anumite operații:

 inițializarea listei – crearea unei liste vide;


 crearea listei – adăugarea repetată a unor elemente, pornind de la o listă vidă;
 inserarea unui element în listă – la început, la sfârșit, în interior;
 ștergerea unui element din listă – de la început, de la sfârșit, din interior;
 parcurgerea listei – analizarea elementelor listei, pentru a obține anumite informații
despre ele;
 căutarea unui element într-o listă;
 concatenarea a două liste, divizarea unei liste.

O modalitate deja cunoscută de implementare a listelor este prin intermediul tablourilor


statice, obținându-se astfel liste liniare secvențiale. Tablourile au fost studiate deja, precum
și operațiile amintite mai sus; ele au o serie de avantaje care trebuie reținute:

 accesul la un anumit element se face prin indicele acestuia și este foarte rapid;
 tablourile sunt zone contigue de memorie – elementele sunt alocate în memorie în
zone învecinate;
 elementele listei conțin numai informațiile utile.

Ele au și o serie de dezavantaje:

 operațiile de inserare și ștergere a elementelor presupun parcurgerea tabloului, ceea


ce duce la algoritmi lenți;
 dimensiunea tablourilor (numărul de elemente) este precizat la compilare, iar la
execuție pot să apară următoarele situații:
o spațiul alocat pentru tablou poate fi insuficient;
o spațiul alocat pentru tablou poate fi mult mai mare decât este necesar.
STIVA
Stiva (stack) este o structură de date liniară abstractă, pentru care sunt definite operațiile de
adăugare a unui element și eliminare a unui element și aceste operații se realizează la un
singur capăt al structurii, numit vârful stivei.

În timpul operațiilor cu stiva avem acces numai la elementul din vârful stivei.

Operații cu stiva
Cu o stivă se pot face următoarele operații:

 inițializarea stivei – crearea unei stive vide;


 verificarea faptului că o stivă este sau nu vidă;
 adăugarea unui nou element pe stivă – elementul devine vârful stivei. Operația se
numește push;
 eliminarea unui element de pe stivă – se va elimina vârful stivei. Un nou element
devine vârf al stivei, sau ea devine vidă. Operația se numește pop;
 identificarea valorii elementului din vârful stivei – accesul la acel element Operația se
numește top.

Imaginați-vă o stivă de lăzi într-un depozit. Dacă adăugăm încă o ladă, o vom plasa în vârful
stivei. Dacă luăm o ladă, o vom lua pe cea din vârful stivei – altfel s-ar răsturna stiva!!

Deoarece operațiile cu elementele stivei se fac la același capăt, spunem că stiva este o
structură de date de tip LIFO – Last In First Out (ultimul intrat, primul ieșit).

Când folosim stiva?


Programele au la dispoziție memorie, iar o parte a ei se numește de tip stivă – STACK, tocmai
pentru că operațiile cu această memorie se fac pe principiul stivei. Apelul functiilor, deci și
recursivitatea, folosesc memoria de tip stivă, iar înțelegerea acestor concept cere înțelegerea
modului în care funcționează o stivă.

În programe putem folosi stiva atunci când vrem să amânăm efectuarea unor operații până
la obținerea unor rezultate. De exemplu, conversia unui număr din baza 10 în baza 2 constă
în efectuarea succesivă a unor împărțiri la 2. Cifrele reprezentării în baza 2 sunt resturile
împărțirii în ordine inversă. Ne putem imagina că la fiecare împărțire plasăm restul pe o stivă.
În final golim stiva și afișăm valorile întâlnite.

Modalități de implementare a stivei


La fel ca în cazul cozii, stiva poate fi implementată în limbajul C++ în mai multe moduri:

 implementare statică, prin intermediul tablourilor;


 implementare dinamică, prin intermediul listelor alocate dinamic;
 folosirea containerului stack din STL.

Acest articol prezintă implementarea statică și folosirea STL.

Implementarea statică a stivei


Vom folosi un tablou alocat static și o variabilă simplă prin care identificăm vârful stivei. În
continuare considerăm o stivă cu elemente întregi.

Declarații

const int DIM = 100;


int S[DIM], vf;

Inițializarea stivei – crearea unei stive vide

vf = 0;

Verificarea faptului că stiva este vidă

vf == 0 // stivă vidă
vf > 0 // stivă nevidă

Adăugarea unui element – PUSH

S[vf++] = _VALOARE ;

Eliminarea unui element – POP

vf --;

Identificarea valorii din vârful stivei – TOP

S[vf-1]
COADA
Coada (queue) este o structură de date abstractă în care operația de adăugare se realizează
la un capăt, iar cea de eliminare se realizează la celălalt capăt.

În timpul operațiilor cu coada avem acces la un singur element, cel aflat la începutul cozii –
elementul care urmează să se elimine.

Operații cu coada
Cu o coadă se pot face următoarele operații:

 inițializarea cozii – crearea unei cozi vide;


 verificarea faptului că o coadă este sau nu vidă;
 adăugarea unui nou element în coadă. Operația se numește push;
 eliminarea unui element din coadă. Operația se numește pop;
 identificarea valorii elementului de la începutul cozii – accesul la acel element
Operația se numește front.

Operațiile cu coada sunt similare cu modul în care funcționează coada la casa de bilete a
unui cinematograf. Spectatorii vin și se așează în ordine la coadă, ordinea în care cumpără
biletele este aceea în care au sosit.

Deoarece operațiile de eliminare se fac în aceeași ordine ca cele de adăugare, coada este o
structură de date de tip FIFO – First In First Out.

Cum folosim coada?


Vom folosi coada atunci când trebuie să prelucrăm informații într-o ordine precisă, pe măsură
ce acestea sunt identificate. Uneori, informațiile noi sunt determinate pe baza celor vechi,
deja existente în coadă. Mecanismul se numește expandare a cozii și constă în
următoarele:

 adăugăm în coadă informații inițiale


 cât timp coada este nevidă (sau până când am determinat rezultatul căutat)
o scoatem din coadă un element
o cu ajutorul său identificăm noi informații pe care le adăugăm în coadă

În informatică se folosește coada în numeroase situații:

 tipărirea documentelor la imprimantă se face printr-o coadă de așteptare – fiecare


document se adaugă în coadă imprimantei, iar tipărirea propriu-zisă se face în
momentul eliminări din coadă
 evaluarea soluțiilor la probleme pe pbinfo.ro se face pe principiul cozii, în ordinea în
care au fost postate
Modalități de implementare a cozii
La fel ca stiva, și coada poate fi implementată în limbajul C++ în mai multe moduri:

 implementare statică, prin intermediul tablourilor;


 implementare dinamică, prin intermediul listelor alocate dinamic;
 folosirea containerului queue din STL.

Implementarea statică a cozii


Vom folosi un tablou unidimensional alocat static Q și două variabile simple prin care
identificăm începutul (st) și sfârșitul stivei (dr). Numele variabilelor provine de
la stânga și dreapta, deoarece adăugarea unui element în coadă se face adăugând un
element în tabloul suport Q, iar eliminare se face mărind variabila st – ignorând elementele
din față, fără a le șterge efectiv.

În continuare considerăm o coadă cu elemente întregi.

Declarații

const int DIM = 1000;


int Q[DIM], st, dr;

Inițializarea cozii – crearea unei cozi vide

st = 1 , dr = 0;

Verificarea faptului că este vidă coada

st > dr // stivă vidă


st <= dr // stivă nevidă

Adăugarea unui element – PUSH

Q[++dr] = _VALOARE ;

Eliminarea unui element – POP

st ++;

Identificarea valorii de la începutul cozii – TOP

Q[st]

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