Sunteți pe pagina 1din 7

Structura de tip Stiva

• Def: Stiva este o structură de date în care operațiile de introducere și extragere se


efectuează doar pe o singură extremitate, numită varf.
• Proprietati:
            -Extremitatile stivei se numesc baza si varf.
            - accesul la nodurile stivei este permis numai prin extremitatea varf.
            - stiva se mai numeste si structura de tip LIFO (Last In First Out)

IMPLEMENTARE
Implementarea stivei se poate face:
• cu alocare inlantuita. – la fel ca a unei liste liniare dar se vor folosi numai adaugarea in
fata primului nod si eliminarea primului nod.
• cu alocare secventiala – este un mecanism mult mai simplu pentru adaugarea si
eliminarea nodurilor,realizata prin intermediul unui vector.
Concluzie: cea mai simpla implementare a stivelor este cea secventiala cu ajutorul unui vector.
DECLARAREA STIVEI
Sintaxa:

const unsigned NMAX=100; unde: tip_data = orice tip al limbajului


typedef <tip_data> nod;                     val    = valoarea introdusa in nod
nod stiva [NMAX+1], val;                       vf        = varful stivei
unsigned vf,baza;

Prelucrarea se face de la varf spre baza. Accesul la informatia din varful stivei se face cu stiva
[vf]

PRELUCRAREA STIVEI

1. Testarea stivei
a.stiva vida:
int este_vida (unsigned vf)
{return vf == NULL;}
unde este_vida e o functie cu valoarea 1 daca stiva e vida si 0 in caz contrar.
b.stiva plina:
int este_plina (unsigned vf)
{return vf == NMAX;}
unde este_plina e o functie cu valoarea 1 daca stiva e plina si 0 in caz contrar.
2. Initializarea stivei - In aceasta secventa se creeaza stiva vida:
void init (unsigned &vf)
{vf = NULL;}
3. Adaugarea unui nod in stiva:
void adauga (unsigned &vf, nod val)
{if (! este_plina(vf))
    { vf++;    stiva [vf] = val;}}
Exemplu: Pentru o stiva in care se adauga 3 caractere a,b,c operatiile de adaugare se executa
astfel:

4. Extragerea unui nod din stiva:

void extrage (unsigned &vf)


{if (! este_vida(vf))
    vf --;}
Exemplu: Eliminarea a doua caractere din stiva se executa astfel:

5. Prelucrarea stivei:
void prelucrare (unsigned &vf)
{ while (! este_vida (vf))
{ //se prelucreaza stiva[vf];
    extrage(vf);} }
-Pentru a ajunge la informatia care trebuie prelucrata din stiva trebuie extrase toate nodurile
pana la nodul care contine acea informatie.
-Pentru a nu pierde informatiile extrase se poate folosi o alta stiva (de rezerva) iar dupa
prelucrare nodurile pot fi incarcate din nou in stiva.

Aplicații ale stivei:


Stiva este o structură de date foarte utilă în multe domenii ale informaticii și ale matematicii.
Printre cele mai comune aplicații ale stivei se numără: evaluarea expresiilor matematice,
parcurgerea în adâncime a unui graf, găsirea unui drum într-un labirint, analiza sintactică a
unui limbaj de programare și gestionarea proceselor în sistemele de operare.
Operații standard ale stivei:
În afara operațiilor de adăugare și extragere a nodurilor, stiva are și alte operații standard,
cum ar fi:
 peek (accesarea valorii din vârful stivei fără a o extrage)
 size (obținerea numărului de elemente din stivă)
 isEmpty (verificarea dacă stiva este goală)
 isFull (verificarea dacă stiva este plină, în cazul implementării cu alocare secvențială).

APLICATIE:
    1.Dat fiind un șir de caractere, să se inverseze ordinea caracterelor folosind o
stivă.
Rezolvarea constă în parcurgerea șirului de caractere și plasarea fiecărui
caracter pe stivă. După ce s-a terminat de parcurs șirul, se extrag caracterele din
stivă și se adaugă la un nou șir de caractere. Aceasta va fi șirul inversat.

#include <iostream>

#include <stack>

#include <string>

using namespace std;

string reverseString(string input) {


stack<char> s;

string output = "";

// push each character onto the stack

for (int i = 0; i < input.length(); i++) {

s.push(input[i]);

// pop each character off the stack and add to output string

while (!s.empty()) {

output += s.top();

s.pop();

return output;

int main() {

string input = "hello world";

string output = reverseString(input);

cout << output << endl; // should print "dlrow olleh"

return 0;}

      În acest exemplu, se definește o funcție reverseString care primește un șir de caractere input.
Se creează o stivă s și un șir de caractere output. Fiecare caracter din input este plasat pe stivă
folosind funcția push(). Apoi, fiecare caracter este extras din stivă și adăugat la sfârșitul șirului
output folosind funcția top() și pop(). La sfârșit, funcția returnează șirul inversat output.
În acest exemplu, șirul de intrare este "hello world", iar șirul de ieșire este "dlrow olleh".

2. Scrieți un program care primește un șir de paranteze și verifică dacă acesta este format
corect, adică toate parantezele se deschid și se închid corect, fără erori.
Rezolvare:
Programul va utiliza o stivă pentru a verifica dacă parantezele se deschid și se închid în ordine
corectă.
Algoritmul constă în parcurgerea șirului de paranteze și introducerea fiecărei paranteze deschise
pe stivă. Dacă se întâlnește o paranteză închisă, se va verifica dacă aceasta corespunde cu
ultima paranteză deschisă, scoțând ultimul element din stivă.
Dacă la final stiva este goală, înseamnă că șirul de paranteze este format corect.
Codul programului ar putea arăta astfel:
#include <iostream>

#include <stack>

#include <string>

using namespace std;

bool verificaParanteze(string expresie) {

        stack<char> stiva;

        for (char paranteza : expresie) {

                if (paranteza == '(' || paranteza == '[' || paranteza == '{') {

                        stiva.push(paranteza);

                } else if (paranteza == ')' || paranteza == ']' || paranteza == '}') {

                        if (stiva.empty()) {

                                return false;

                        } else if (paranteza == ')' && stiva.top() == '(') {

                                stiva.pop();

                        } else if (paranteza == ']' && stiva.top() == '[') {

                                stiva.pop();

                        } else if (paranteza == '}' && stiva.top() == '{') {

                                stiva.pop();

                        } else {

                                return false;

            }

        }

    }

        return stiva.empty();

int main() {

        string expresie;
        cout << "Introduceti o expresie cu paranteze: ";

        cin >> expresie;

        if (verificaParanteze(expresie)) {

                cout << "Expresia este corecta." << endl;

        } else {

                cout << "Expresia este incorecta." << endl;

    }

        return 0;

Acest program va citi un șir de caractere de la tastatură și va utiliza funcția verificaParanteze


pentru a verifica dacă parantezele sunt corecte. Funcția utilizează o stivă de caractere și
parcurge fiecare caracter din expresie, adăugând parantezele deschise pe stivă și eliminând
parantezele închise din stivă atunci când acestea corespund cu ultima paranteză deschisă. Dacă
la sfârșit stiva este goală, înseamnă că expresia este corectă.

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