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 Cola {
17private: // frente_ est le prochain à sortir et final_ le dernier arrivé
18 Nodo* frente_; // Premier nœud de la file
19 Nodo* final_; // Dernier nœud de la file
20 int n_; // Nombre de nœuds
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) { // Enfiler à l'arrière : O(1)
31 Nodo* nuevo = new Nodo(valor); // Créer le nœud
32 if (final_ == nullptr) { // La file est-elle vide ?
33 frente_ = final_ = nuevo; // C'est le seul nœud : frente_ et final_ pointent vers lui
34 } else {
35 final_->setSiguiente(nuevo); // Le dernier nœud pointe vers le nouveau
36 final_ = nuevo; // final_ pointe maintenant vers le nouveau nœud
37 }
38 n_++;
39 }
40
41 void desencolar() { // Défiler l'avant : O(1)
42 if (frente_ == nullptr) return; // File vide : rien à retirer
43 Nodo* temp = frente_; // Conserver l'avant pour pouvoir le libérer
44 frente_ = frente_->getSiguiente(); // frente_ passe au nœud suivant
45 if (frente_ == nullptr) final_ = nullptr; // La file est vide : final_ ne pointe plus vers rien
46 delete temp; // Libérer la mémoire
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}