1#include <iostream>
2using namespace std;
3
4class Nodo { // Ein Knoten enthält die Daten und einen Zeiger auf den nächsten
5private: // Private Attribute: nur die Methoden greifen darauf zu
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: // Der zuletzt abgelegte Knoten ist die Spitze
18 Nodo* cima_; // Oberster Knoten
19 int n_; // Anzahl der Knoten
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) { // Oben ablegen: O(1)
30 Nodo* nuevo = new Nodo(valor); // Knoten erzeugen
31 nuevo->setSiguiente(cima_); // Der neue Knoten zeigt auf die alte Spitze
32 cima_ = nuevo; // cima_ zeigt jetzt auf den neuen Knoten
33 n_++;
34 }
35
36 void desapilar() { // Oberstes entfernen: O(1)
37 if (cima_ == nullptr) return; // Leerer Stapel: nichts zu entfernen
38 Nodo* temp = cima_; // Spitze merken, um sie freizugeben
39 cima_ = cima_->getSiguiente(); // cima_ rückt zum nächsten Knoten nach unten
40 delete temp; // Speicher freigeben
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}