Estructura de Datos Tema 2. Colas Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 dtorres@mixteco.utm.mx Contenido 1. Definición y operaciones 2. Implementación estática 3. Implementación dinámica 4. Colas de prioridad 5. Casos de estudio 2 1
1. Definición y operaciones La cola es una colección ordenada de elementos de la que se pueden borrar elementos en un extremo (llamado el frente de la cola) o insertarlos por el otro (llamado el final de la cola). El primer elemento insertado en la cola, es el primero en ser eliminado; razón por la que a las colas se les conoce como una estructura de datos FIFO (por firstin, first-out) 3 1. Definición y operaciones Insertar un elemento a la cola insertar(&ini,&fin,elemento); Borrar un elemento de la cola elemento= borrar(&ini,&fin); Determinar si la cola esta vacía band=vacia(ini); Determinar si la cola esta llena band=llena(ini); Listar la cola listar(ini); 4 2
Aplicaciones con colas La fila de clientes en el banco, En la parada de camiones, Cola para cargar gasolina, para pagar casetas de cobro etc. Cola de alumnos en la biblioteca, o librería. 5 2. Implementación estática #define MAX 5 typedef struct{ int frente, final; int elementos[max]; tipocola; int main(){ tipocola cola; Representaciones de colas: Como una línea recta (q.frente=-1, q.final=0) normal Como una recta que cuando se elimine un elemento se recorra el resto de la cola al principio Como un círculo (q.frente=q.final=max) 6 3
2. Implementación estática de una cola en línea recta //función que determina si la cola está llena int llena(tipocola colat){ int bandera=0; if (colat.final==max) bandera= 1; return bandera; 7 2. Implementación estática de una cola en línea recta void insertar(tipocola *colat, int dato){ colat->datos[colat->final]=dato; (colat->final)++; 8 4
2. Implementación estática int vacia(tipocola colat){ int bandera=0; if ((colat.frente)+1 == colat.final) bandera= 1; return bandera; 9 2. Implementación estática int eliminar(tipocola *colatemp){ int x; colatemp->frente++; x=colatemp->datos[colatemp->frente]; return x; 10 5
3. Implementación dinámica typedef struct nodo { int info; struct nodo *sig; tiponodo; cola cola Insertar a la cola vacía, el 3, 2 y 8. ini fin 3 ini fin typedef struct cola{ struct nodo * ini; struct nodo * fin; tipocola; cola ini fin typedef tipocola * tipocolaptr; cola typedef tiponodo * tiponodoptr; ini fin void insertar(tipocolaptr colat, int dato); int main(){ tipocola cola={null;... 3 2 3 2 8 11 3. Implementación dinámica void insertar(tipocolaptr colat, int dato){ tiponodoptr nuevo; nuevo=(tiponodoptr)malloc(sizeof(tiponodo)); if(nuevo==null) printf("no hay memoria\n"); else { nuevo->dato=dato; nuevo->sig=null; if(colat->ini==null) colat->ini=nuevo; else colat->fin->sig=nuevo; colat->fin=nuevo; 12 6
3. Implementación dinámica int eliminar(tipocolaptr colat) { tiponodoptr temp; int dato; temp=colat->ini; dato=temp->dato; if(colat->ini==colat->fin) colat->fin=temp->sig; colat->ini=temp->sig; free(temp); return dato; 13 4. Colas de prioridad Tanto la pila como la cola son estructuras de datos cuyos elementos están ordenados conforme se insertaron. La cola de prioridad es una estructura de datos en la que el ordenamiento intrínseco de los elementos determina los resultados de sus operaciones básicas Tipos de colas de prioridad: Cola de prioridad ascendente Cola de prioridad descendente 14 7
4. Colas de prioridad Cola de prioridad ascendente: Colección de elementos en la que pueden insertarse elementos de manera arbitraria y de la que puede eliminarse sólo el elemento menor. Cola de prioridad descendente: Es similar a la de prioridad ascendente, pero sólo permite la eliminación del elemento mayor. 15 4. Colas de prioridad Implementación dinámica typedef struct nodo{ int prioridad; //ej. 1,2 char nombre[20]; struct nodo * sig; tiponodo; typedef struct{ tiponodo *ini; tiponodo *fin; tipocola; 16 8
4. Colas de prioridad 17 Casos de estudio Sistema de un supermercado Ventanilla en un banco 18 9
Referencias 1. Tenenbaum, Aaron & Langsam, Yedidyah & Augenstein, Moshe Estructuras de Datos en C. Prentice-Hall, México 1997. 2. Deitel & Deitel Como programar en C/C++. Prentice-Hall, México 3. Wirth, Niklaus Algoritmos y estructura de Datos. Prentice-Hall, México. 19 10