1#include <iostream>
2using namespace std;
3
4class Nodo { // Un nœud contient la donnée et un pointeur vers le suivant
5private: // Attributs privés : seules les méthodes y touchent
6 int dato;
7 Nodo* siguiente;
8public:
9 Nodo(int d) : dato(d), siguiente(nullptr) {}
10 int getDato() const { return dato; }
11 Nodo* getSiguiente() const { return siguiente; }
12 void setDato(int d) { dato = d; }
13 void setSiguiente(Nodo* s) { siguiente = s; }
14};
15
16class Pila {
17private: // Le dernier nœud empilé est le sommet
18 Nodo* cima_; // Nœud du sommet
19 int n_; // Nombre de nœuds
20
21public:
22 Pila() : cima_(nullptr), n_(0) {}
23
24 // Destructor (no se anima)
25 ~Pila() {
26 while (cima_ != nullptr) desapilar();
27 }
28
29 void apilar(int valor) { // Empiler au sommet : O(1)
30 Nodo* nuevo = new Nodo(valor); // Créer le nœud
31 nuevo->setSiguiente(cima_); // Le nouveau nœud pointe vers l'ancien sommet
32 cima_ = nuevo; // cima_ pointe maintenant vers le nouveau nœud
33 n_++;
34 }
35
36 void desapilar() { // Dépiler le sommet : O(1)
37 if (cima_ == nullptr) return; // Pile vide : rien à retirer
38 Nodo* temp = cima_; // Conserver le sommet pour pouvoir le libérer
39 cima_ = cima_->getSiguiente(); // cima_ descend au nœud suivant
40 delete temp; // Libérer la mémoire
41 n_--;
42 }
43
44 // Muestra la pila de la cima a la base
45 void imprimir() const {
46 cout << "cima ->";
47 for (Nodo* p = cima_; p != nullptr; p = p->getSiguiente())
48 cout << " " << p->getDato();
49 cout << endl;
50 }
51};
52
53int main() {
54 Pila pila;
55 pila.apilar(3);
56 pila.apilar(6);
57 pila.apilar(9);
58 pila.imprimir(); // cima -> 9 6 3
59 pila.desapilar();
60 pila.imprimir(); // cima -> 6 3
61 pila.apilar(1);
62 pila.imprimir(); // cima -> 1 6 3
63 return 0;
64}