|
|||||||
|
|
|
|||||
|
|
|||||||
Una cola es una estructura lineal, en la cual los elementos sólo pueden ser adicionados por uno de sus extremos y eliminados o consultados por el otro.
Este tipo de estructuras lineales se conocen como estructuras FIFO ( First-In-First-Out), o sea, el primero en llegar es el primero es salir.
También hay que tener presente, que el único elemento visible en una cola es el primero y mientras éste no haya salido (eliminado), no es posible tener acceso al siguiente.
Interfaz
Como al igual que otras estructuras, existen diferentes formas de implementar una Cola, empezamos por la declaración de una interfaz, con las operaciones básicas.
interface Cola
{
void insertar(Object x);
Object info( ) throws Exception;
void eliminar( ) throws Exception;
boolean esVacia( );
void vaciar( );
}
Métodos
insertar( x ) --> Inserta x
eliminar( ) --> Elimina el primer elemento
info( ) --> Retorna el primer elemento
esVacia( ) --> Retorna true si no existen elementos ; false en caso contrario
vaciar( ) --> Elimina todos los elementos
Implementación con Lista Enlazada
class Nodo
{
public Object dato;
public Nodo siguiente;
public Nodo(Object elemento, Nodo sgte)
{
this.dato = elemento;
this.siguiente = sgte;
}
public Nodo(Object elemento)
{
this(elemento,null);
}
}
class ColaLi implements Cola
{
private Nodo primero;
private Nodo ultimo;
public ColaLi( )
{
primero = ultimo = null;
}
public boolean esVacia( )
{
return primero == null;
}
public void vaciar( )
{
primero = ultimo = null;
}
public Object info( ) throws Exception
{
if (esVacia( ) )
throw new Exception("info");
return primero.dato;
}
public void eliminar( ) throws Exception
{
if (esVacia( ))
throw new Exception("eliminar");
primero = primero.siguiente;
}
public void insertar(Object x)
{
if (esVacia( ) )
primero = ultimo = new Nodo(x);
else
ultimo = ultimo.siguiente = new Nodo(x);
}
}
Programa de prueba
El programa consiste en ir despachando un cierto número de clientes (15) que
se encuentran en una cola , en forma aleatoria.
Se asigna al azar un número del 0 al 9. Si sale el número 5 , este cliente se retira de
la cola y se muestran sus datos, en función del tiempo que estuvo en la cola.
Si al contrario , no sale el 5 , el cliente vuelve a la cola y tiene que esperar una próxima
ronda.
Este proceso no acaba mientras exitan clientes en la cola.
salida del programa
Desde el punto de vista del cliente se produce lo siguiente :
SI (sale el 5) se imprimen mis datos y me voy SINO me integro nuevamente a la cola y espero tener suerte en la proxima ronda FIN SI
Se creó una clase que almacenara la cantidad de esperas (vueltas) en la cola, y el número que lo identifica.
Por cada vuelta que da la cola, el valor de esperas se va incrementando.
class Cliente
{
int esperas;
int num;
}
class pruebaCola
{
public static void main(String arg[ ])
{
System.out.println("\n\tPROGRAMA DE PRUEBA");
System.out.println("\t------------------\n");
Cola c = new ColaLi( );
Cliente aux;
for(int i = 0 ; i < 15; )
{
aux = new Cliente( );
aux.esperas = 0;
aux.num = ++i;
c.insertar(aux);
}
System.out.println("\tnum\tesperas\t\ttiempo");
System.out.println("\t---\t-------\t\t------");
int tiempo_espera = 0;
try
{
for(;;)
{
int despachado = (int) (Math.random( ) * 10.0);
aux = (Cliente) c.info( );
tiempo_espera += (int) (Math.random( ) * 2.0);
if (despachado == 5)
{
System.out.print("\n\t" + aux.num);
System.out.print("\t" + aux.esperas);
System.out.print("\t\t" + tiempo_espera);
}
else
{
aux.esperas++;
c.insertar(aux);
}
c.eliminar( );
}
} catch(Exception e) { }
c.vaciar( );
System.out.println( );
}
}