#include // Definiciones generales struct NodoQ { int dato; NodoQ* sig; }; struct Cabecera { NodoQ* primero; NodoQ* ultimo; int max; int cant; int* datos; int primeroIdx; int ultimoIdx; }; typedef Cabecera* QEnt; // Funciones comunes para colas no acotadas y acotadas QEnt crearCola(); void encolar(int x, QEnt& q); bool esVaciaCola(QEnt q); int primero(QEnt q); void desencolar(QEnt& q); void eraseQ(QEnt& q); // Funciones adicionales para colas acotadas QEnt crearCola(int max); bool estaLlenaCola(QEnt q); // Implementación no acotada QEnt crearCola() { QEnt q = new Cabecera; q->primero = nullptr; q->ultimo = nullptr; return q; } void encolar(int x, QEnt& q) { NodoQ* nuevo = new NodoQ; nuevo->dato = x; nuevo->sig = nullptr; if (q->primero == nullptr) { q->primero = nuevo; } else { q->ultimo->sig = nuevo; } q->ultimo = nuevo; } bool esVaciaCola(QEnt q) { return q->primero == nullptr; } int primero(QEnt q) { return q->primero->dato; } void desencolar(QEnt& q) { NodoQ* aBorrar = q->primero; q->primero = q->primero->sig; delete aBorrar; } void eraseQ(QEnt& q) { while (q->primero != nullptr) { NodoQ* aBorrar = q->primero; q->primero = q->primero->sig; delete aBorrar; } delete q; } // Implementación acotada con memoria estática QEnt crearCola(int max) { QEnt q = new Cabecera; q->max = max; q->cant = 0; q->primeroIdx = 0; q->ultimoIdx = max - 1; q->datos = new int[max]; return q; } bool estaLlenaCola(QEnt q) { return q->cant == q->max; } void encolar(int x, QEnt& q) { q->ultimoIdx = (q->ultimoIdx + 1) % q->max; q->datos[q->ultimoIdx] = x; q->cant++; } int primero(QEnt q) { return q->datos[q->primeroIdx]; } void desencolar(QEnt& q) { q->primeroIdx = (q->primeroIdx + 1) % q->max; q->cant--; } void eraseQ(QEnt& q) { delete[] q->datos; delete q; } // Implementación acotada con memoria dinámica QEnt crearCola() { QEnt q = new Cabecera; q->primero = nullptr; q->ultimo = nullptr; q->cant = 0; return q; } void encolar(int x, QEnt& q) { NodoQ* nuevo = new NodoQ; nuevo->dato = x; nuevo->sig = nullptr; if (q->primero == nullptr) { q->primero = nuevo; } else { q->ultimo->sig = nuevo; } q->ultimo = nuevo; q->cant++; } bool estaLlenaCola(QEnt q) { return q->cant == q->max; } void desencolar(QEnt& q) { NodoQ* aBorrar = q->primero; q->primero = q->primero->sig; delete aBorrar; q->cant--; } void eraseQ(QEnt& q) { while (q->primero != nullptr) { NodoQ* aBorrar = q->primero; q->primero = q->primero->sig; delete aBorrar; } delete q; }