MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Stiva std::stack

Clasa std::stack<T> reprezintă o stivă – o structură de date care funcționează după principiul LIFO (last-in, first-out – „ultimul intrat, primul ieșit”) — întotdeauna se extrage primul elementul adăugat cel mai recent. Stiva poate fi comparată cu o grămadă de obiecte, de exemplu, o grămadă de farfurii – farfuriile se adaugă deasupra, fiecare farfurie nouă se pune peste cea precedentă. Iar dacă trebuie să luăm o farfurie, se ia mai întâi cea de deasupra (cea adăugată ultima).

Pentru a lucra cu o stivă trebuie inclus fișierul antet <stack>. Definirea unei stive goale:

#include <iostream>
#include <stack>
 
int main()
{
    std::stack<std::string> stack;    // stivă goală de șiruri de caractere
}

Dimensiunea stivei

Cu ajutorul funcției size() putem obține numărul de elemente din stivă, iar cu empty() putem verifica dacă stiva este goală (dacă returnează true, atunci stiva nu conține elemente):

#include <iostream>
#include <stack>
 
int main()
{
    std::stack<std::string> stack;
    if(stack.empty())
    {
        std::cout << "stack is empty" << std::endl;
    }
    std::cout << "stack size: " << stack.size() << std::endl; // stack size: 0
}

Adăugarea elementelor

Pentru a adăuga elemente în stivă se folosește funcția push(), căreia i se transmite elementul de adăugat:

#include <iostream>
#include <stack>
 
int main()
{
    std::stack<std::string> stack;
    // adăugăm trei elemente
    stack.push("Tom");
    stack.push("Bob");
    stack.push("Sam");
 
    std::cout << "stack size: " << stack.size() << std::endl; // stack size: 3
}

Obținerea elementelor

Putem obține doar elementul din vârful stivei – pentru aceasta se folosește funcția top():

#include <iostream>
#include <stack>
 
int main()
{
    std::stack<std::string> stack;
    stack.push("Tom");
    stack.push("Bob");
    stack.push("Sam");
    std::cout << "Top: " << stack.top() << std::endl;   // Top: Sam
}

În acest caz, după adăugarea celor trei elemente, stiva va arăta astfel:

-------
| Sam |
-------
| Bob |
-------
| Tom |
-------

În vârful stivei se află ultimul element adăugat. Cu ajutorul funcției top() putem accesa acest element.

Ștergerea elementelor

Pentru ștergere se folosește funcția pop(). Ștergerea se face în ordinea inversă adăugării:

stack.pop();

Combinând această funcție cu top() putem extrage toate elementele din stivă:

#include <iostream>
#include <stack>
 
int main()
{
    std::stack<std::string> stack;
    stack.push("Tom");
    stack.push("Bob");
    stack.push("Sam");
 
    while (!stack.empty())  // cât timp stiva nu este goală
    {
        std::cout << stack.top() << std::endl;
        stack.pop();    // extragem elementul din vârf
    }
}

În acest caz, cât timp stiva nu este goală, se afișează în consolă elementul din vârf (ultimul adăugat) folosind top() și apoi este eliminat cu pop(). Ieșirea în consolă a programului:

Sam  
Bob  
Tom

Inițializarea cu un deque

Stiva poate fi inițializată și cu o altă stivă sau cu un deque (coadă dublu-extremă):

#include <iostream>
#include <stack>
 
int main()
{
    std::deque<std::string> users{"Tom", "Sam", "Bob"};
    std::stack<std::string> stack {users};
 
    while (!stack.empty())
    {
        std::cout << stack.top() << std::endl;
        stack.pop();
    }
}