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
| Metodo | Descrizione |
|---|---|
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)dequelist
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.
Strumenti:
- Libreria
<stack> - Metodi push, pop, top
- Simulazione di stati
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.