5 minute read
Cola Circular
from ESTRUCTURA DE DATOS
by carloslopez
Una cola circular es una variante de la cola lineal que supera eficazmente la limitación de la cola lineal. En la cola circular, el nuevo elemento se agrega en la primera posición de la cola si el último está ocupado y hay espacio disponible. Cuando se trata de cola lineal, la inserción se puede realizar solo desde la parte trasera y la eliminación desde la parte delantera. En una cola completa, después de realizar una serie de eliminaciones sucesivas en la cola, surge una situación determinada en la que no se puede agregar ningún elemento nuevo incluso si el espacio disponible porque la condición de subdesbordamiento (Posterior = máx.
La cola circular conecta los dos extremos a través de un puntero donde el primer elemento viene después del último elemento. También realiza un seguimiento de la parte delantera y trasera implementando una lógica adicional para poder rastrear los elementos que se insertarán y eliminarán. Con esto, la cola circular no genera la condición de desbordamiento hasta que la cola está llena en realidad.
Advertisement
Algunas condiciones seguidas por la cola circular:
✓ El frente debe apuntar al primer elemento. ✓ La cola estará vacía si Front = Rear. ✓ Cuando se agrega un nuevo elemento, la cola se incrementa en el valor uno (Posterior = Posterior + 1). ✓ Cuando se elimina un elemento de la cola, el anverso se incrementa en uno (Anverso = Anverso + 1).
Este tipo de estructura obliga a dejar siempre una posición libre para separar el principio del final, pero evidentemente siempre existirá la limitación de que podrá llenarse completamente la cola.
Operaciones Básicas de la C O L A C I R C U L A R
Colas circulares (anillos): En las que el último elemento y el primero están unidos.
Los elementos pueden consultarse, añadirse y eliminarse únicamente desde la cabeza del anillo que es una posición distinguida. Existen dos operaciones de rotaciones, una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor, respectivamente, de la cabeza actual.
Anillo en Maude
fmod ANILLO {X :: TRIV} is sorts AnilloNV{X} Anillo{X} . subsort AnilloNV{X} < Anillo{X} .
Int num; If(vacía()) No funcia code op crear : -> Anillo{X} [ctor] . op insertar : X$Elt Anillo{X} -> AnilloNV {X} [ctor] .
-> Anillo{X} . ops rotarDch rotarIzq : Anillo{X} -> Anillo{X} . op cabeza : AnilloNV{X} -> X$Elt . op esVacio? : Anillo{X} -> Bool . op aLaCola : X$Elt Anillo{X} -> Anillo{X} . op elimCola : Anillo{X} -> Anillo{X} . op cola : AnilloNV {X} -> X$Elt .
var A : Anillo{X} . vars E E2 : X$Elt .
eq eliminar(crear) = crear . eq eliminar(insertar(E, A)) = A .
eq cabeza(insertar(E, A)) = E .
eq esVacio?(crear) = true . eq esVacio?(insertar(E, A)) = false .
eq cola(insertar(E, crear)) = E . eq cola(insertar(E, insertar(E2, A))) = cola(insertar(E2, A)) .
eq elimCola(crear) = crear . eq elimCola(insertar(E, crear)) = crear . eq elimCola(insertar(E, insertar(E2, A))) = insertar(E, elimCola(insertar(E2, A))) .
eq aLaCola(E, crear) = insertar(E, crear) . eq aLaCola(E, insertar(E2, A)) = insertar(E2, aLaCola(E, A)) .
ANILLOS
en Pseudolenguaje
FUNC CrearCola() : TCola VARIABLES cola: TCola INICIO
cola.frente <- MAXCOLA cola.final <- MAXCOLA RESULTADO <- cola
FIN
PROC DestruirCola(&cola: TCola) INICIO //Sin modificaciones FIN
FUNC ColaLlena(cola: TCola): LÓGICO INICIO
FIN RESULTADO <- (cola.final MOD MAXCOLA) + 1 = cola.frente
FUNC ColaVacia(cola: TCola): LÓGICO INICIO
RESULTADO <- cola.final = cola.frente
FIN
PROC MeterCola (&cola: TCola; &e: Telemento; &error: Terror) VARIABLES fin: NATURAL INICIO
SI ColaLlena(cola) ENTONCES error <- ErrorColaLlena EN OTRO CASO error <- NoError fin <- (cola.final MOD MAXCOLA) + 1 cola.final <- fin cola.elementos[fin] <- e
FINSI
FIN
PROC SacarCola (&cola: TCola; &e: Telemento; &error: Terror) VARIABLES ini: NATURAL
INICIO
SI ColaVacia(cola) ENTONCES error <- ErrorColaLlena EN OTRO CASO error <- NoError ini <- (cola.frente MOD MAXCOLA) + 1 cola.frente <- ini e <- cola.elementos[ini]
Algoritmos
Insertar un elemento en la cola
Extraer un elemento de la cola
La notación di+1 -> di significa que el elemento situado en la posición i+1 debe ser copiado a la posición i. Esto es lo que ocurre en la vida cotidiana, en concreto, cuando una persona ha acabado su gestión en la ventanilla y la abandona, los demás deben moverse hacia adelante, es decir, el segundo pasa a ser el primero, el tercero al segundo y así sucesivamente. Para una cola pequeña, este algoritmo es sencillo y eficaz, pero cuando la cola es grande, el corrimiento de datos puede suponer un gasto de tiempo que enlentece el programa, razón por la cual, mostramos a continuación otro procedimiento mucho mejor para evitar este problema.