Sunteți pe pagina 1din 30

Unidad V

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).

Especificaciones del tipo de datos abstracto cola

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

Especificaciones del tipo de datos abstracto cola


Cola vaca Cola llena
Comprobar si la cola no tiene elementos Comprobar si la cola esta llena de elementos

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

Las acciones que estn permitidas en una cola son:


Creacin de una cola vaca.

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.

COLAS IMPLEMENTADAS CON ARRAYS

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.

COLAS IMPLEMENTADAS CON ARRAYS

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.

COLAS IMPLEMENTADAS CON ARRAYS

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.

Definicin de la clase cola

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.

Definicin de la clase cola


Las operaciones bsicas del tipo abstracto de datos cola: insertarQ, eliminarQ, queVacia, queLlena, y frenteQ. La operacin insertarQ toman un elemento del tipo TipoDeDato y lo aaden al final de la cola. La operacin eliminarQ suprime (quita) y devuelve el elemento de la cabeza o frente de la cola. La operacin frenteQ devuelve el elemento que est en la posicin frente de la cola, sin eliminar el elemento y por tanto no modifica la cola.

Definicin de la clase cola


En las operaciones de control, quevacia comprueba si la cola est vaca; es necesaria esta comprobacin antes de eliminar un elemento; queLlena comprueba si la cola est llena, esta comprobacin se realiza antes de insertar un nuevo miembro. Si las precondiciones para insertarO y eliminarQ se violan, el programa debe generar una excepcin o error.

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); }

// mtodos de verificacin del estado de la cola

public boolean quevaca(){ return frente>ultimo; }


public boolean queLlena(){ return ultimo == MAXTAMQ-1;
} }

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.

Definicin del TDA Cola con un array circular


Un array circular con n elementos.
n -1 0 1

Definicin del TDA Cola con un array circular


El array se almacena de modo natural en la memoria tal como un bloque lineal de n elementos. Se necesitan dos marcadores (punteros), frente y final, para indicar la posicin del elemento que precede a la cabeza y la posicin del final, donde se almacen el ltimo elemento aadido. Una cola vaca se representa por la condicin frente = final.

Definicin del TDA Cola con un array circular


La variable frente es siempre la posicin del elemento que precede al primero de la cola y se avanza en el sentido de las agujas del reloj. La variable final es la posicin en donde se hizo la ltima insercin; una nueva insercin supone mover final circularmente a la derecha.

Definicin del TDA Cola con un array circular


Una cola vaca
frente ultimo n-1 0 n-1 0

Una cola con un elemento


frente ultimo

Definicin del TDA Cola con un array circular


La implementacin del movimiento circular se realiza utilizando la teora de los restos:
Mover ultimo adelante = (ultimo + 1) % MAXTAMQ Mover frente adelante = (frente + 1) % MAXTAMQ

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 ?

Definicin del TDA Cola con un array circular


Comprobar si una cola est llena:
(ultimo + 1) % MAXTAMQ == frente ?

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

Definicin del TDA Cola con un array circular


Las variables instancia no cambian respecto a la definicin de una cola considerando un array lineal. En esta nueva definicin, la operacin de mover ndices se realiza con el mtodo privado siguiente(), que aplica la teora de restos para avanzar el frente o el ultimo (final) de la cola.
package colaArrayCircular; public class Cola{ private static int MAXTAMQ = 99; private int frente; private int ultimo; private TipoDeDato [] listaQue;

private int siquiente(int r){ return (r+1) % MAXTAMQ; }

Definicin del TDA Cola con un array circular

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); }

Definicin del TDA Cola con un array circular

Definicin del TDA Cola con un array circular


// mtodos de verificacin del estado de la cola public boolean queVacia(){ return frente == ultimo; } public boolean queLlena(){ return siguiente(ultimo) == frente; }

S-ar putea să vă placă și