17/04/2012 Estructura de Datos Estructura de datos Colas Temario Unidad II 2.1 Definición y operaciones 2.2 Implementación estática 2.3 Implementación dinámica 2.4 Colas de prioridad 2.5 Casos de estudio 1 17/04/2012 Definición Es una estructura de datos en la cual los elementos se eliminan por uno de sus extremos, llamado frente o cabeza, y se añaden por el otro extremo, denominado final o fondo. Las inserciones y eliminaciones se realizan siguiendo la función de una estructura FIFO (First In First Out). Las colas también son llamadas FIFO que quiere decir el primero que entra es el primero que sale. Clasificación Colas simples: Se inserta por un sitio y se saca por otro, en el caso de la cola simple se inserta por el final y se saca por el principio. Para gestionar este tipo de cola hay que recordar siempre cual es el siguiente elemento que se va a leer y cual es el último elemento que se ha introducido. 910 973 175 137 En este ejemplo el ultimo nodo es 137. 2 17/04/2012 … Clasificación Colas circulares: En las colas circulares se considera que después del último elemento se accede de nuevo al primero. De esta forma se reutilizan las posiciones que hayan quedado vacías, el final de la cola es a su vez el principio, creándose un circuito cerrado. ... an a1 frente a2 an... final 1 … Clasificación Colas con prioridad: Las colas con prioridad se implementan mediante listas o arreglos ordenados. No interesa en este caso que salgan en el orden de entrada sino con una prioridad que se le asigne. En el caso que existan varios elementos con la misma prioridad saldrá primero aquel que primero llego (FIFO). 3 17/04/2012 Ejemplos de colas Las colas de impresión, las colas de atención a procesos, las colas circulares que representan una red tipo anillo, representaciones para problemas como el de Joseph. La implementación al igual que las Pilas es estática (vectores) o dinámica. Cola simple Considerando la siguiente definición de tipos: typedef struct nodo{ // estructura que define el nodo tipo_elem dato; struct nodo *siguiente; } Nodo; typedef struct { Nodo *frente; Nodo *frente; } Cola; 4 17/04/2012 Cola simple Inserción void insertar(Cola *cola,tipo_elem x) { Nodo *nuevo; nuevo =(Nodo *)malloc (sizeof(Nodo)); nuevo->dato=x; nuevo->siguiente=nuevo; // Hace que el nodo que almacena el nuevo valor apunte hacia el mismo if (colaVacia(*cola)) cola->frente = nuevo; else cola-final->siguiente = nuevo; cola-final-> nuevo; } Cola simple Eliminación void eliminar(Cola *cola){ // Se elimina el elemento que se encuentre al frente de la cola Nodo *aux; // aux es un nodo auxiliar que contendrá el nodo a eliminar tipo_elem temp; if (!colaVacia(*cola)) { aux =cola->frente; temp = cola ->frente -> dato; cola ->frente = cola ->frente ->siguiente; printf("\nElemento eliminado %c ",temp); free(aux); } else printf("\n Error al eliminar en cola vacia "); } 5 17/04/2012 Cola circular Considerando la siguiente definición de tipos: typedef struct nodo{ // estructura que define el nodo tipo_elem dato; struct nodo *siguiente; } Nodo; typedef Nodo *Cola; Implementación Inserción void insertar(Cola *cola,tipo_elem x) { Nodo *nuevo; nuevo =(Nodo *)malloc (sizeof(Nodo)); nuevo->dato=x; nuevo->siguiente=nuevo; // Hace que el nodo que almacena el nuevo valor apunte hacia el mismo if (!colaVacia(*cola)) { nuevo->siguiente =(*cola)->siguiente; (*cola)->siguiente = nuevo; } *cola =nuevo; // El ultimo nodo ingresado en la cola siempre ser· al que apunte Cola } 6 17/04/2012 Implementación Eliminación void eliminar(Cola *cola){ // Se elimina el elemento que se encuentre al frente de la cola Nodo *aux; // aux es un nodo auxiliar que contendrá el nodo a eliminar tipo_elem temp; if (!colaVacia(*cola)) { aux =(*cola)->siguiente; temp= aux->dato; if (aux ==(*cola)) (*cola)= NULL; else (*cola)->siguiente = aux->siguiente; printf("\nElemento eliminado %c ",temp); free(aux); } else printf("\n Error al eliminar en cola vacia "); } Cola de prioridad Una cola de prioridad es una cola a cuyos elementos se les ha asignado una prioridad, de forma que el orden en que los elementos son procesados sigue las siguientes 2 reglas: •El elemento con mayor prioridad es procesado primero. •Dos elementos con la misma prioridad son procesados según el orden en que fueron introducidos en la cola. 7 17/04/2012 Cola de prioridad Ejemplos: Colas de impresión, servicio de urgencias de un hospital, atención a clientes preferenciales en un banco, etc. Nota.-Hay una solución alternativa de implementación usando árboles binarios pero dado el orden de temas para el curso no se considerará en esta unidad. Las alternativas de solución son con la estructura de datos lineal cola. Métodos básicos para la representación de colas de prioridad 1. Tener la cola siempre ordenada de acuerdo a las prioridades de sus elementos y sacar cada vez el primer elemento de ésta, es decir, el de mayor prioridad. En este caso, cuando se introduce un elemento en la cola, debe insertarse en el lugar correspondiente de acuerdo a su prioridad. 2. Insertar los elementos siempre al final de la cola, y cuando se va a sacar un elemento, buscar el que tiene mayor prioridad. Nota.- Se optará por usar el método (1), ya que la búsqueda de la posición en la cual se inserta un nuevo elemento requiere menos operaciones que la búsqueda del elemento que se saca para el caso (2). 8