Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Colas


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

bajar archivos