Está en la página 1de 6

8/07/2019

PROGRAMACION II

Colas
Oswaldo Velez-Langs, PhD
oswaldovelez@correo.unicordoba.edu.co

Colas. Modelos (I)


 DEFINICIÓN: Estructura de Datos que contiene una serie de elementos
en la que dichos elementos son insertados por un lado (encolar) y
extraídos por el lado contrario (desencolar).

• CARACTERÍSTICA: Primer elemento obtenido es el primero introducido.


Estructura FIFO (First Input, First Output)
Modelo
abstracto

desencolar 3 2 5 3 1 encolar

• Posibles implementaciones:
• Lista enlazada: desencolar = eliminarPrimero y encolar= insertarAlFinal.
• Lista circular. (Ver apartado).
• Lista enlazada donde la clase Cola es un “registro” de dos punteros.

1
8/07/2019

Colas. Modelos (II)


Memoria estática
Implementación como

Cola cola

Memoria dinámica
lista enlazada

desencolar 3 5
n
u
encola
2 l
l

Memoria estática
Cola ultimo
como lista circular

Memoria dinámica
Implementación

desencolar 2 encola
7 3 5
r

Colas. Modelos (III)


Implementación como estructura de dos
punteros
Memoria estática
Cola

encolar n
Memoria dinámica
1 u
l
l
principio

fin

3
desencola
3 2 5
r

2
8/07/2019

Colas
• El modelo anteriormente expuesto se conoce como una Bicola.
• Al tipo de datos Bicola se le puede poner restricciones respecto a la
entrada o a la salida de elementos. Una Bicola con restricción de
entrada es aquella que sólo permite inserciones por uno de los dos
extremos, pero que permite retirar elementos por los dos extremos.
Una Bicola con restricción de salida es aquella que permite
inserciones por los dos extremos, pero sólo permite retirar elementos
por uno de ellos.

Colas. Código (I).


• Clase NodoCola

class NodoCola {
int dato;
NodoCola siguiente;

NodoCola (int elemento, NodoCola n) {


dato = elemento;
siguiente = n;
}
}

3
8/07/2019

Colas. Código (II).


• Clase Interfaz (Cola.java)
public interface Cola {
void inicializarCola ();
void encolar (int x);
int desencolar () throws ColaVacia;
boolean colaVacia ();
void leerCola () throws NumberFormatException,IOException;
void imprimirCola ();
void invertirCola (throws ColaVacia);
int numElemCola ();
int primero () throws ColaVacia;
void quitarPrimero () throws ColaVacia;
void eliminarCola ();
}

Colas. Código (III).


• Clase TadCola [Parcial]
public class TadCola implements Cola {
private NodoCola principio; public void encolar (int x) {
private NodoCola fin; NodoCola aux;
public TadCola () {
aux = new NodoCola (x, null);
principio = null;
if (principio == null) {
fin = null;
} principio = aux;
public boolean colaVacia () { fin = aux;
return principio == null; }
} else {
public int desencolar () throws fin.siguiente = aux;
ColaVacia { fin = aux;
int resultado; }
if (colaVacia ()) }
throw new ColaVacia ("Desencolar: }
La cola está vacía");
resultado = principio.dato;
principio = principio.siguiente;
if (principio == null)
fin = null;
return resultado;
}

4
8/07/2019

public class ColaVacia extends Exception {


public ColaVacia (String mensaje){
super(mensaje)
public ColaVacia(){
super()
}
}

Ejercicios
• Escribir un programa en el que se generen 100 números aleatorios en el
rango –25 ... +25 y se guarden en una cola implementada mediante alguno
de los modelos ilustrados. Una vez creada la cola, el usuario puede solicitar
que se forme otra cola con los números negativos que tiene la cola original.
• Suponga que tiene ya codificados los métodos que implementan las
operaciones del TAD Cola. Escribir un método para crear una copia de una
cola determinada. Las operaciones que se han de utilizar serán únicamente
las del TAD Cola .
• Suponga que tiene ya codificados los métodos que implementan las
operaciones del TAD Cola. Escribir un método que tenga como argumentos
dos colas del mismo tipo y devuelva cierto si las dos colas son idénticas.

10

5
8/07/2019

Ejercicio (Discusión en Clase)

• Una variación del problema matemático llamado “problema de José” (para


más info mire: https://es.wikipedia.org/wiki/Problema_de_Flavio_Josefo)
permite generar números de la suerte. Se parte de una lista de n números;
esta lista se va reduciendo siguiendo el siguiente algoritmo:
1. Se genera un número aleatorio n1.
2. S i n1 <= n se quitan de la lista los números que ocupan las posiciones
1,1+n1,1+2*n1, ...; n toma el valor del número de elementos que quedan en la lista.
3. S e vuelve al paso 1.
4 . Si n1 > n fin del algoritmo, los números de la suerte son los que quedan en la lista.

11