Operații cu stiva — push, pop, top și stack din STL

Bază~14 min6 pași

De ce contează?

La un teanc de farfurii ai trei mișcări: pui una deasupra, te uiți care e deasupra, sau o iei pe cea de deasupra. Atât. Stiva din STL îți dă fix aceste trei operații, gata făcute, ca să nu mai scrii nimic de mână.

Operațiile fundamentale

Orice stivă oferă patru operații, toate la vârf:

OperațieCe faceCost
push(x)adaugă x în vârfO(1)
pop()elimină vârfulO(1)
top()citește vârful (fără a-l scoate)O(1)
empty()spune dacă e goalăO(1)
Observația-cheie

Toate operațiile sunt O(1) — instantanee, indiferent câte elemente are stiva. Asta o face foarte eficientă acolo unde se potrivește.

std::stack din STL

În loc să implementezi stiva de mână, folosești stack din STL — testat și fără bug-uri de indici:

#include <iostream>
#include <stack>
using namespace std;

int main() {
    stack<int> s;

    s.push(10);
    s.push(20);
    s.push(30);

    cout << s.top() << "\n";   // 30 (varful, nescos)
    s.pop();                   // scot 30
    cout << s.top() << "\n";   // 20
    cout << s.size() << "\n";  // 2
    cout << s.empty() << "\n"; // 0 (nu e goala)
    return 0;
}

Atenție: top() și pop() sunt separate

La std::stack, pop() nu întoarce valoarea — e void. Dacă vrei valoarea scoasă, o citești cu top() înainte de pop():

int x = s.top();   // citesc valoarea
s.pop();           // apoi o elimin
cout << x << "\n";

E o sursă frecventă de confuzie pentru cei veniți din alte limbaje, unde pop întoarce elementul.

Golirea unei stive

Nu există o funcție clear. Scoți elementele cât timp nu e goală:

while (!s.empty()) {
    cout << s.top() << " ";   // 20 10 (in ordine inversa)
    s.pop();
}

Asta afișează elementele în ordine inversă intrării — comportamentul LIFO.

Vizualizare

Urmărește efectul fiecărei operații asupra vârfului:

Indiciu

Folosește și pentru a urmări fiecare push/pop. top() doar evidențiază vârful, fără să-l mute.

Greșeli frecvente

Capcane la operațiile cu stiva:

  • Aștepți ca pop() să întoarcă valoarea: la std::stack e void. Citește cu top() înainte de pop().
  • top()/pop() pe stivă goală: comportament nedefinit. Verifică !s.empty() întâi.
  • Cauți clear(): nu există; golești cu o buclă while (!empty()) pop().
  • Uiți #include <stack>: std::stack nu e recunoscut fără el.

Recapitulare

  • Stiva are patru operații O(1): push, pop, top, empty.
  • La std::stack, pop() e void — ia valoarea cu top() înainte de a o scoate.
  • Verifică mereu !empty() înainte de top()/pop(); golești printr-o buclă.

Întrebarea 1 / 3

Ce face `top()` la un `stack` din STL?