Linguaggio C++

Libreria Stack

Introduzione alla libreria stack del C++: struttura LIFO, metodi principali e laboratorio guidato con esempi applicativi.

La libreria <stack> fornisce il contenitore std::stack, una struttura dati basata sul principio LIFO (Last In, First Out).

È ideale quando gli elementi devono essere gestiti come una pila:

  • ultimo inserito → primo ad essere rimosso
  • navigazione indietro
  • valutazione espressioni
  • memorizzazione stati

1️⃣ Inclusione della libreria


#include <stack>
using namespace std;

2️⃣ Dichiarazione e inizializzazione


stack S;
stack nomi;

3️⃣ Metodi principali di std::stack

MetodoDescrizione
push(x)Aggiunge un elemento sopra la pila
pop()Rimuove l ultimo elemento
top()Visualizza l elemento in cima
empty()Ritorna true se la pila è vuota
size()Numero degli elementi

4️⃣ Esempio base: push, top, pop


stack S;

S.push(10);  // [10]
S.push(20);  // [10, 20]
S.push(30);  // [10, 20, 30]

cout << S.top(); // 30
S.pop();         // rimuove 30

cout << S.top(); // 20

5️⃣ Stack di stringhe


stack storia;

storia.push("Pagina 1");
storia.push("Pagina 2");
storia.push("Pagina 3");

cout << "Ultima pagina: " << storia.top();
storia.pop();

6️⃣ Stack e contenitori sottostanti

Uno stack può usare come base:

  • vector (default)
  • deque
  • list

Esempio:


stack> S2;

7️⃣ Esempio: controllo parentesi in un espressione


string expr = "(1+(2*3))";

stack P;

for(char c : expr){
    if(c == "(") P.push(c);
    if(c == ")"){
        if(P.empty()) cout << "Errore!";
        P.pop();
    }
}

if(P.empty()) cout << "Espressione valida!";

8️⃣ Applicazioni tipiche

  • funzione Annulla (Undo)
  • navigazione avanti/indietro nel browser
  • conversione da infisso a postfisso
  • DFS (Depth-First Search)

9️⃣ Esempio completo


stack S;

for(int i=1; i<=5; i++)
    S.push(i);

while(!S.empty()){
    cout << S.top() << " ";
    S.pop();
}
LABORATORIO

Uso del Contenitore stack

In questo laboratorio imparerai a utilizzare la struttura std::stack per simulare la cronologia di un applicazione e per gestire operazioni LIFO.


1 Cronologia di navigazione

Crea uno stack che memorizza le pagine visitate: Aggiungi 5 pagine, poi torna indietro di 2 passaggi.


stack cronologia;

cronologia.push("Home");
cronologia.push("Prodotti");
cronologia.push("Articolo");
cronologia.push("Recensioni");
cronologia.push("Contatti");

cout << "Torno da: " << cronologia.top() << endl;
cronologia.pop();
cout << "Torno da: " << cronologia.top() << endl;
cronologia.pop();

2 Calcolatrice semplice (somma)

Inserisci 5 numeri nello stack e somma tutti i valori estraendoli uno a uno.


stack S;
int somma = 0;

for(int i=0; i<5; i++){
    int x;
    cin >> x;
    S.push(x);
}

while(!S.empty()){
    somma += S.top();
    S.pop();
}

cout << "Somma = " << somma;

3 Verifica parentesi bilanciate

Controlla un espressione e verifica se le parentesi () sono bilanciate.


string s;
cin >> s;

stack P;
bool valido = true;

for(char c : s){
    if(c == "(") P.push(c);
    if(c == ")"){
        if(P.empty()){
            valido = false;
            break;
        }
        P.pop();
    }
}

if(!P.empty()) valido = false;

cout << (valido ? "OK" : "ERRORE");

4 Esercizi

  • Usa uno stack per invertire una stringa.
  • Trasforma un numero decimale in binario usando la pila.
  • Implementa una versione semplificata della funzione Undo/Redo.
  • Crea uno stack che memorizza operazioni (add, sub) e le esegue al contrario.