You are on page 1of 21

Cola (Queue)

Algoritmos y Estructuras de Datos 1

Universidad ORT Uruguay Florencia Sarasola 2012

Queue
Las colas son listas con la restriccin que las

inserciones se deben realizar al final (back) y se debe eliminar desde el principio (front).

Queue Operaciones
Las operaciones fundamentales de una cola son:
enqueue Insertar un elemento al final de la cola (la cola no est llena)
dequeue Elimina el primer elemento de la cola (la cola no est vaca)
dequeue enqueue

COMBINA

front Retorna el primer elemento de la cola (la cola no est vaca)

front

Queue Implementacin
Veremos dos implementaciones:
5 9 3 1 8

Lista enlazada
5 9 3 1 8

Array
5 9 3 1 8

Queue Interfaz
public interface IQueue { /** * Pre.: La cola no esta llena. * Pos.: Inserta el carcter pasado como argumento en la cola. * @param o */ public void enqueue (Object o); /** * Pos.: Retorna true si y solo si la cola es vaca. * @return true si y solo si la cola es vaca. */ public boolean isEmpty ( ); /** front * Pos.: Retorna true si y solo si la cola esta llena. * @return true si y solo si la cola esta llena dequeue */ public boolean isFull ( );

enqueue

Queue Interfaz
/** * Pre.: La cola no * Pos.: Retorna el * @return elemento */ public Object front es vaca. elemento ubicado en el frente de la cola. ubicado en el frente de la cola

( );

/** * Pre.: La cola no es vaca. * Pos.: Elimina el elemento ubicado en el frente de la cola. */ public void dequeue ( ); }
front

dequeue

enqueue

Queue Implementacin: Lista


ENQUEUE

Insertar al final de la lista


DEQUEUE

Eliminar el primer elemento de la lista


FRONT

Retornar el primer elemento de la lista


Clase representa el nodo: Node

Cada nodo contiene un elemento y un Node


Clase interfaz (ya vista) Clase implementa
dequeue front enqueue

Queue Implementacin: Lista (Node)


public class Node { public Object element; public Node next; public Node (Object o){ this.element = o; this.next = null; } public Node (Object o, Node s){ this.element = o; this.next = s; } public void borrar(){ } }

Queue Implementacin: Lista


(implementacin)
public class Queue implements IQueue, Cloneable { private Node front; private Node back; /** * Pos.: Constructor. Crea la cola vaca. */ public Queue ( ){ this.front = this.back = null; } public void dequeue() { Node aux = this.front; this.front = this.front.next(); aux.next = null; aux.borrar(); if (this.front == null){ this.back = null; } }

front

dequeue

enqueue

Queue Implementacin: Lista


(implementacin)
public void enqueue(Object o) { Node nuevo = new Node(o); if (this.front == null){ this.back = nuevo; this.front = this.back; }else{ this.back.next = nuevo; this.back = this.back.next; } }

public boolean isFull() { return false; }


front

dequeue

enqueue

Queue Implementacin: Lista


(implementacin)
public Object front() { return this.front.element(); } public boolean isEmpty() { return this.front == null; }

public Queue clone(){ Queue copia = new Queue(); if(!this.isEmpty()){ Node aux = this.front; while(aux!=null){ copia.enqueue(aux.element); aux = aux.next(); } front } return copia; } dequeue

enqueue

Queue Implementacin: Array


La clase QueueArray contendr tres atributos:

theArray : array front: int back: int

Constructor front = 0, back = -1 ENQUEUE


Incremento back e inserto en el theArray[back]

DEQUEUE
Incremento front
front

FRONT
Retornar el valor theArray[front]
dequeue enqueue

Queue Implementacin: Array


F 4 DEQUEUE 4 DEQUEUE FRONT 2 4 5 5 F 5 2 F 2 F 4 ENQUEUE (13) 5 2 7 2 B 7 B 7 B 7 B 9

front

dequeue

enqueue

CANTIDAD ELEMENTOS: 4

CANTIDAD ELEMENTOS:3

CANTIDAD ELEMENTOS: 2

ENQUEUE (9)

CANTIDAD ELEMENTOS: 3
La cola tiene capacidad pero back llego al final del array

Queue Implementacin: Array


Problema:
La cola no esta llena Back se encuentra en el ultimo lugar del array

Solucin:
Implementar el array como un array circular

ENQUEUE (x)
back++ if (back==dimension){back = 0} theArray[back ]=x

DEQUEUE
front++ if (fronto==dimension){front = 0}
front

FRONT
Retornar el valor theArray[front]
dequeue enqueue

front

Queue Implementacin: Array


F 7 ENQUEUE(1) B 1 ENQUEUE(3) FRONT DEQUEUE 1 DEQUEUE F 1 7 1 B 3 B 3 B 3 F 7 F 7 2 F 2 2 B 2

dequeue

enqueue

CANTIDAD ELEMENTOS: 2

CANTIDAD ELEMENTOS: 3

CANTIDAD ELEMENTOS: 4

CANTIDAD ELEMENTOS: 3

CANTIDAD ELEMENTOS: 2

front

Queue Implementacin: Array


F 1 DEQUEUE B 3 FB 3 DEQUEUE B F

dequeue

enqueue

CANTIDAD ELEMENTOS: 2

CANTIDAD ELEMENTOS: 1

CANTIDAD ELEMENTOS: 0
Como diferencio la situacin de que esta llena o vacia la cola

B 1 3 5

F 7 2 CANTIDAD ELEMENTOS: 5

Queue Implementacin: Array


Problema:
Difcil reconocer cuando la cola esta llena o vaca

Solucin:
Agregar un atributo: CurrentSize

Obs.: Debido a que esta implementacin representa

una cola acotada, se debe aadir la precondicin de que la cola no este llena para el mtodo ENQUEUE (definido en la interfaz)

front

Queue Implementacin: Array


public class QueueArray implements IQueue { static final int DIMENSION = 10; private private private private Object[] theArray; int front; int back; int currentSize;

dequeue

enqueue

/** * Pos.: Constructor. Crea la cola vaca. */ public QueueArray (){ this.theArray = new Object[DIMENSION]; this.front = 0; this.back = -1; this.currentSize = 0; }

front

Queue Implementacin: Array


public void dequeue() { this.currentSize--; this.front++; if(this.front==DIMENSION){ this.front = 0; } } public void enqueue(Object o) { this.currentSize++; this.back++; if(this.back==DIMENSION){ this.back = 0; } this.theArray[this.back] = o; }

dequeue

enqueue

front

Queue Implementacin: Array

dequeue

enqueue

public Object front() { return this.theArray[this.front]; }

public boolean isEmpty() { return this.currentSize==0; }


public boolean isFull() { return this.currentSize==DIMENSION; } }

Queue Aplicacin
Colas de impresin
Cuando enviamos un documento a imprimir, este ser impreso segn el orden de llegada. Se imprime el primer archivo enviado. Las impresoras cuentan con una cola de impresin donde se almacenan los archivos a imprimir segn su llegada