Documente Academic
Documente Profesional
Documente Cultură
Colas (Queue)
COLAS
Es una estructura de datos que almacena elementos en una lista y permite acceder a los datos por uno de los dos extremos de la lista.
frente
final
COLAS
Un elemento se inserta en la cola (parte final) de la lista y se suprime o elimina por el frente (parte inicial, frente) de la lista. Las aplicaciones utilizan una cola para almacenar elementos en un orden de aparicin o concurrencia.
COLAS
Los elementos se eliminan (se quitan) de la cola en el mismo orden en que se almacenan y, por consiguiente, una cola es una estructura de tipo FIFO (first-in/first-out, primero en entrar/primero en salir; o bien primero en llegar/primero en ser servido).
COLAS
Ejemplos:
El servicio de atencin a clientes en un almacn.
La accin de gestin de memoria intermedia (buffering) de trabajos. Tareas de impresora en un distribuidor de impresoras (spooler).
Las operaciones que sirven para definir una cola y poder manipular su contenido son las siguientes:
Tipo de dato: Dato que se almacena en la cola Operaciones:
Crear cola Insertar Quitar Inicia la cola como vaca Aade un dato por la final de la lista Retira (extrae) el elemento frente de la cola
Frente Obtiene el elemento frente o primero de la cola Tamao de la cola Numero de elementos mximo que puede
contener la cola
Desde el punto de vista de estructura de datos, una cola es similar a una Pila. En una cola, los datos se almacenan de un modo lineal y el acceso a lo datos solo esta permitido en los extremos de la cola.
COLAS
Verificacin de que una cola est vaca. Aadir un dato al final de una cola. Eliminacin de los datos de la cabeza de la cola.
Al igual que las pilas, las colas se pueden implementar utilizando arrays o listas enlazadas. La definicin de una Cola ha de contener un array para almacenar los elementos de la cola, y dos marcadores o punteros (variables instancia) que mantienen las posiciones frente y final de la cola; es decir, un marcador apuntando a la posicin de la cabeza de la cola y el otro al primer espacio vaco que sigue al final de la cola.
Cuando un elemento se aade a la cola, se verifica si el marcador final apunta a una posicin vlida, entonces se aade el elemento a la cola y se incrementa el marcador final en 1. Cuando un elemento se elimina de la cola, se hace una prueba para ver si la cola est vaca y, si no es as, se recupera el elemento de la posicin apuntada por el marcador (puntero) de cabeza y ste se incrementa en 1.
Este procedimiento funciona bien hasta la primera vez que el puntero de cabeza o cabecera alcanza el extremo del array y sta queda o bien vaca o bien llena.
Una cola debe manejar diferentes tipos de datos; por esta circunstancia, los elementos han de ser de un tipo genrico. En Java todava no est definido el tipo genrico, sin embargo utilizando objetos y referencias, el tipo del elemento de una cola puede ser Object, que es la clase base de cualquier clase definida en Java. En esta primera definicin se deja abierto el tipo de los elementos, se supone que es de TipoDeDato.
La clase Cola contiene un array (ListaQue) cuyo mximo tamao se determina por la constante MAXTAMQ. Se definen dos tipos de variables puntero o marcadores, frente y ultimo. Estos son los punteros de cabecera y cola o final, respectivamente.
package colaArray; public class Cola{ private static final int MAXTAMQ = 39; private int frente; private int ultimo; private Object [] listaQ; public Cola(){ frente = 0; ultimo = 1; listaQ = new TipoDeDato [MAXTAMQ]; } // operaciones de modificacin de la cola public void insertarQ(Object elemento) throws Exception { if (!queLlena()) listaQ[++ultimo] = elemento; else throw new Exception(Overflow en la cola); }
public TipoDeDato eliminarQ() throws Exception{ if (!queVacia()) return listaQue[frente++]; else throw new Exception(Cola vacia); } public void borrarCola(){ frente = 0; ultimo = 1; } // acceso a la cola public TipoDeDato frenteQ(){ if (!quevacia()) return listaQue[frente]; else throw new Exception(Cola vacia); }
Esta implementacin de una cola es notablemente ineficiente, se puede alcanzar la condicin de cola llena habiendo elementos del array sin ocupar. Esto es debido a que al realizar la operacin de eliminar un elemento avanza el frente, y por consiguiente las posiciones anteriores quedan desocupadas, no accesibles. Una solucin a este problema es hacer que frente no se incremente y a la vez desplazar todos los elementos una posicin a la izquierda. Entonces se aadira el mtodo:
private void desplazar(){ for (int j=0; j<ultimo-1; j++) listaQue[j] = listaQue[j+1]; ultimo--; } El mtodo eliminar queda: public TipoDeDato eliminarQ() throws Exception if (!queVaia()){ TipoDeDato aux; aux = listaQue [frente]; desplazar(); return aux; } else throw new Exception(Cola vacia); }
A tener en cuenta
En la operacin de eliminar, la alternativa de desplazar los elementos del array de modo que la cabeza de la cola vuelve al principio del array es costosa en trminos de tiempo de computadora, especialmente si los datos almacenados en el array son estructuras de datos grandes.
A tener en cuenta
El medio ms eficiente, sin embargo, para almacenar una cola en un array es utilizar un tipo especial de array que una el extremo final de la cola con su extremo cabeza. Tal array se denomina array circular y permite que el array completo, se utilizar para almacenar elementos de la cola sin necesidad de que ningn dato se desplace.
Los algoritmos que formalizan la gestin de colas en un array circular han de incluir al menos las siguientes tareas:
Creacin de una cola vaca: frente = ultimo = 0. Comprobar si una cola esta vaca: es frente == ultimo ?
Aadir un elemento a la cola: si la cola no est llena, aadir un elemento en la posicin siguiente a ultimo y se establece:
ultimo = (ultimo + 1) % MAXTAMQ
Eliminacin de un elemento de una cola: si la cola no esta vaca, suprimirlo de la posicin siguiente a frente y establecer
frente = (frente + 1) % MAXTAMQ
public Cola(){ frente = ultimo = 0; listaQue = new TipoDeDato [MAXTAMQ]; } // operaciones de modificacin de la cola
public void insertarQ(TipoDeDato elemento) throws Exception { if (!queLlena()){ ultimo = siguiente (ultimo); listaQue[ultimo] = elemento; } else throw new Exception(Overflow en la cola); }
public TipoDeDato eliminarQ() throws Exception{ if (!queVacia()){ frente = siguiente(frente); return listaQue[frente]; } else throw new Exception(Cola vacia);
public void borrarCola(){ frente = ultimo =0; } // acceso a la cola public TipoDeDato frenteQ(){ if (!queVacia()) return listaQue[siguiente (frente)]; else throw new Exception(cola vacia); }