Estas tienen un grave problema, como las extracciones sólo pueden realizarse por un extremo, puede llegar un momento en que el apuntador A sea igual al máximo número de elementos en la cola, siendo que al frente de la misma existan lugares vacíos, y al insertar un nuevo elemento nos mandará un error de overflow (cola llena).
Para solucionar el problema de desperdicio de memoria se implementaron las colas circulares, en las cuales existe un apuntador desde el último elemento al primero de la cola.
La representación gráfica de esta estructura es la siguiente:
La condición de vacío en este tipo de cola es que el apuntador F sea igual a cero.
Las condiciones que debemos tener presentes al trabajar con este tipo de estructura son las siguientes:
- Over flow, cuando se realice una inserción.
- Under flow, cuando se requiera de una extracción en la cola.
- Vacio
F<=0
A<=0
***Algoritmo de insertar:
Si (F+1=A) ó (F=1 y A=máximo) entonces
mensaje (overflow)
en caso contrario
inicio
si A=máximo entonces
A<=1
cola[A]<= valor
en caso contrario
A <=A+1
cola[A]<=valor
si F=0 entonces
F <=1
fin
***Algoritmo a extraer:Si F=0 entonces
mensaje (underflow)
en caso contrario
x <= cola[F]
si F=A entonces
F <= 0
A<= 0
en caso contrario
si F=máximo entonces
F <=1 en caso contrario F <= F+1
Colas Dobles (Bicolas): Estructura lineal en la que los elementos se pueden añadir o quitar por cualquier extremo de la cola (cola bidireccional).
Esta estructura es una cola bidimensional en que las inserciones y eliminaciones se pueden realizar en cualquiera de los dos extremos de la bicola. Gráficamente representamos una bicola de la siguiente manera:
Existen dos variantes de la doble cola:
- Doble cola de entrada restringida: sólo acepta inserciones al final de la cola
- Doble cola de salida restringida: acepta eliminaciones sólo al frente de la cola
***Algoritmos de inicialización:
f<=1
A<=0
***Algoritmo para insertar:
Si A=máximo entonces
mensaje (overflow)
en caso contrario
A <=A+1
cola[A]<= valor
***Algoritmo para extraer:
Si F>A entonces
mensaje (underflow)
en caso contrario
mensaje (frente/atrás)
si frente entonces
x <=cola[F]
F <= F+1
en caso contrario
x <= cola[A]
A <=A-1
**Algoritmos de salida restringida**
***Algoritmo de inicialización:
f<=1
A<=0
**Algoritmo para insertar:
Si F>A entonces
mensaje (overflow)
en caso contrario
mensaje (Frente/Atrás)
si Frente entonces
cola[F] <=valor
en caso contrario
A <= A+1
cola[A] <=valor
***Algoritmo para extraer:
Si F=0 entonces
mensaje (underflow)
en caso contrario
x <=cola[F]
F <= F+1