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 Cola {
17private: // frente_ verlässt als Nächstes die Schlange, final_ ist der zuletzt Angekommene
18 Nodo* frente_; // Erster Knoten der Warteschlange
19 Nodo* final_; // Letzter Knoten der Warteschlange
20 int n_; // Anzahl der Knoten
21
22public:
23 Cola() : frente_(nullptr), final_(nullptr), n_(0) {}
24
25 // Destructor (no se anima)
26 ~Cola() {
27 while (frente_ != nullptr) desencolar();
28 }
29
30 void encolar(int valor) { // Hinten einreihen: O(1)
31 Nodo* nuevo = new Nodo(valor); // Knoten erzeugen
32 if (final_ == nullptr) { // Ist die Warteschlange leer?
33 frente_ = final_ = nuevo; // Es ist der einzige Knoten: frente_ und final_ zeigen darauf
34 } else {
35 final_->setSiguiente(nuevo); // Der letzte Knoten zeigt auf den neuen
36 final_ = nuevo; // final_ zeigt jetzt auf den neuen Knoten
37 }
38 n_++;
39 }
40
41 void desencolar() { // Vorne entnehmen: O(1)
42 if (frente_ == nullptr) return; // Leere Warteschlange: nichts zu entfernen
43 Nodo* temp = frente_; // Vordersten Knoten merken, um ihn freizugeben
44 frente_ = frente_->getSiguiente(); // frente_ rückt zum nächsten Knoten vor
45 if (frente_ == nullptr) final_ = nullptr; // Warteschlange ist leer: final_ zeigt auf nichts mehr
46 delete temp; // Speicher freigeben
47 n_--;
48 }
49
50 // Muestra la cola del frente al final
51 void imprimir() const {
52 cout << "frente ->";
53 for (Nodo* p = frente_; p != nullptr; p = p->getSiguiente())
54 cout << " " << p->getDato();
55 cout << endl;
56 }
57};
58
59int main() {
60 Cola cola;
61 cola.encolar(3);
62 cola.encolar(6);
63 cola.encolar(9);
64 cola.imprimir(); // frente -> 3 6 9
65 cola.desencolar();
66 cola.imprimir(); // frente -> 6 9
67 cola.encolar(1);
68 cola.imprimir(); // frente -> 6 9 1
69 return 0;
70}