DELPHI MANIA
www.delphimania.com.ar
 
 
 
  Delphi Mania  >> Articulos >> Colas
 
   
   
   
   
 
   
   
   
   
   
     
     
     
     
     
     
     

Colas


            Una Cola es un tipo especial de Listas en el cual los elementos se insertan en un extremo, y se eliminan por el otro extremo, siendo estos los únicos lugares por donde se pueden insertar o suprimir datos de la estructura.

            Las Colas son estructuras que se conocen también como Listas tipo FIFO (esta sigla proviene del inglés: First In, First Out), y quiere decir que el primer elemento que sea insertado será el próximo en salir en el momento de suprimir un elemento de la cola.

            Este tipo de estructura son utilizadas para resolver numerosos problemas del mundo real. Un ejemplo muy simple es si se quiere modelizar una fila de personas que está esperando para ser atendidas en cualquier negocio o está por entrar a un cine, un estadio, etc. En estos casos siempre aquella persona que haya llegado primero será la primera en ser atendida o en entrar ("siempre existen aquellos que se adelantan, pero por ahora no los tenemos en cuenta").

            Como los lenguajes por lo general no poseen este tipo de dato, debe ser por consiguiente el programador quien los implemente utilizando alguna de las estructuras más simples que le provee el lenguaje para definir sus propios tipos. Si estamos en Delphi lo podemos hacer de diferentes formas dependiendo de la metodología de programación que estemos utilizando. Lo más recomendable es hacerlo mediante un TAD ya que de esta manera nos estaremos abstrayendo de la estructura interna que utilizamos para almacenar los elementos de la cola y solo nos importará que hacen las operaciones que nos provee el tipo.

            Las pricipales operaciones que deben poder efectuarse sobre una cola son las que permite crear o inicializar una pila, otras para insertar y eliminar elementos, y en algunos casos debe existir también alguna que nos permita destruir la cola. Hay otras operaciones que no modifican la cola, sino que sólo devuelven información a cerca del estado de la misma.

            Cuando intentemos resolver el problema de como almacenar los elementos dentro de la cola nos encontraremos ante una disyuntiva entre diferentes formas de realización, las más utilizadas son las basadas en arreglos y aquellas que utilizan enlaces entre los elementos.


Implementación de Colas con arreglos:

            Con este modelo de realización, se dice que es implementada con arreglos porque se utiliza un vector para almacenar los elementos de la cola. Junto con esta estructura donde almacenaremos los elementos deberémos también registrar otra información para el control de la cola, como puede ser la cantidad de elementos de la cola y el número máximo de elementos que podrá contener la cola.

            Como ya dijimos anteriormente una buena metodología de implemetación de una cola es mediante un TAD, para esto debemos crear una unidad dentro de nuestro proyecto en Delphi y dentro de esta vamos a declarar lo siguiente:

Const cantMaxima = ...;       //nro. maximo de elementos de la cola

Type tipoDato       = ...;       //tipo de dato de los elementos de Cola

        Cola            = Class
          private
            elementos : array [ 1 .. cantMaxima ] of tipoDato;
            cantActual : integer;
          public
            ...
           //métodos necesarios para el manejo de la cola
            ...
        end;


            Aquí hemos definido una Clase Cola con las variables y operaciones necesarias para su manipulación. Podemos ver que si definimos asi la estructura de la clase, solo vamos a poder acceder a la cola por medio de los métodos que definamos y de esta manera estaremos ocultando la estructura interna de la cola, lo que hace entre otras cosas que nuestras Aplicaciones sean más confiables y mantenibles.


Implementación de Colas con punteros:

            Este modelo no utiliza una gran estructura interna para contener todos los elementos sino que cada elemento conoce cual es el elemento que le sigue mediante un enlace, puntero, entre elementos. De esta manera nos quedará una cadena de elementos que podrá ir creciendo o disminuyendo su longitud a medida que vayamos insertando o eleminando elementos de ella en nuestros programas.

            Para poder realizar esta implementación de una cola vamos a tener que definir una clase que contenga punteros al primer y último elemento de la cadena de elementos y además una variable para poder registrar el número de elementos de la cola, aunque esta última variable podría no ser necesaria y podríamos igualmente recorrer la cadena de elementos para calcular este valor,si se hace uso de esta variable, haremos que algunas operaciones sobre la cola sean mucho más eficientes en cuanto al tiempo de ejecución.

            El encabezado de la unidad donde definamos la clase cola, con el modelo de realización basado en punteros, quedará de la siguiente manera:

Type Tipo_elemento = ...;

        TDato = ^Dato;

        Dato = TObject
           elemento : Tipo_elemento;
           siguiente : TDato;
         ...
         // métodos del objeto Dato
         ...
        end;

        Cola = Class
          Private
            elementos : TDato;
            nroElementos : integer;
          Public
           ...
           //métodos para el manejo de Colas
           ...
        end;

      

            Si definimos asi la clase cola, no vamos a poder tener acceso a la estructura interna de la cola, solamente vamos a poder acceder a la cola mediante los métodos que hemos definido para el manejo de la cola. Si en algún momento cambiamos el modelo de realización de la estructura interna de la cola, en los programas que hayamos hecho uso de esta clase no tendremos que cambiar nada pues el funcionamiento no va a cambiar y como solo hemos hecho uso de las operaciones provistas y no hemos manipulado la estructura interna entonces nuestro programa no sufrirá ningún problema.

            Si analizamos ambos modelos de realización, arreglos vs. punteros, podemos notar ciertas ventajas en cada uno de los modelos que se deben tener en cuenta antes de la realización de la clase y que puede afectarnos nuestros programas. El modelo basado en arreglos tiene un número máximo de elementos para la cola mientras que el modelo realizado con punteros puede variar su tamaño sin inconvenientes. Esto lo podemos enmendar poniendo un número suficientemente grande en el tamaño del arreglo, pero si luego solo necesitamos una pequeña cola de elementos, entonces estaremos desperdiciando memoria.
            Por el contrario la realización basada en punteros trae aparejada en ciertos casos cierto retardo en la ejecución de sus operaciones pues puede ocurrir que en ciertos casos tengamos que recorrer toda la estructura mientras que si lo hacemos con arreglos lo podemos hacer en un solo acceso. En conclusión no existe una realización mejor que otra sino que depende del contexto donde deba ejecutarse.


Diferentes Tipos de Colas:

            Existen diferentes modelos de Colas dependiendo de como se inserten o eliminen los elementos, estos sirven para modelizar casos muy puntuales, por ejemplo se pueden nombrar:

- Colas Circulares: es una cola simple, con la única diferencia que si recorremos la cola, entonces el último elemento de la cola tiene un elemento siguiente, que es el primer elemento.

- Colas de Prioridad: los elementos dentro de la estructura deben tener definida de alguna manera una prioridad. Cuando insertamos un elemento lo ordenamos dentro de la estructura de tal manera que este quede ordenado de acuerdo a su prioridad y la de los demás elementos de la cola. Cuando queremos sacar un elemento sacamos el de mayor prioridad.

- Colas Dobles: los elementos a diferencia de una cola simple pueden ser insertados y eliminados por ambos extremos de la estructura.

   
   
   
   
DELPHI MANIA  
 
Las marcas que aparecen en esta pagina pertenecen a sus respectivas empresas
Todos los derechos reservados - Copyrigth 2001