SlideShare una empresa de Scribd logo
EL TDA COLA Estructuras de Datos
DEFINICION Abunda este concepto, en la vida cotidiana Cuando vamos al cine, para comprar las entradas Cuando estamos en el supermercado, en el banco, etc. Como funciona Se puede decir que la cola tiene 2 extremos FRENTE, Y FINAL La computadora las utiliza: Para manejar la impresión de documentos, tiempo compartido, etc. Queue  -> Cola Cada documento que se manda a imprimir es “encolado”, uno a uno es enviado a la impresora Frente Final Final Frente Todo el que llega se ubica al final de la cola Todo el que sale, lo hace por el frente de la cola La cola es por turno El primero en llegar, tiene la seguridad de que sera el primero en salir:  FIRST IN  FIRST OUT -> FIFO
OPERACIONES BASICAS Al suponer que existe un TDA Cola, podemos: Cola Q; Todo TDA presenta operaciones basicas, en este caso: EnColar Insertar un elemento nuevo a la cola, al final de la misma,  El final aumenta DesEnColar Cuando un elemento es removido de la cola Remueve el elemento del  frente Retorna el elemento removido No se puede ejecutar si la cola  EstaVacia Asi como en la pila Cualquier intento de acceder a elementos en una Cola Vacia: SUBDESBORDAMIENTO DE LA COLA
COLAS: OPERACIONES QVaciar(Cola q) Recibe una cola y la vacia QEliminar(Cola q) Recibe una cola y elimina todos los elementos que en ella existen, para dejarla vacia QEstaVacia(Cola q) Determina si una cola esta vacia o no Frente(Cola q) Devuelve el elemento del frente de la cola Final(Cola q) Devuelve el elemento del final de la cola QDesEnColar(Cola q) Remueve el elemento del frente de la cola Devuelve el elemento removido No se puede remover si esta vacia QEnColar(Cola q, elemento) Inserta el elemento al final de la cola El final aumenta en uno
IMPLEMENTACIONES Las colas se pueden implementar de muchas formas Una cola es Un conjunto ordenado de elementos Se supone que no tiene limite en su crecimiento Una cola es una LISTA Por lo tanto, la implementaciones posibles para la cola son  Las mismas posibles para la LISTA Contigua(Estatica) Enlazada(Dinamica) Sin embargo, en cada una de las posibles implementaciones Se pueden realizar ciertos cambios que se ajusten mas al concepto de la cola typedef LSCont Cola; typedef LSE Cola;
RECORDEMOS ENTONCES.. Que para implementar la Cola Debo decidir sobre que implementacion de lista basarme Las implementaciones de las operaciones de la Cola Solo llaman a las operaciones de las listas QEnColar llamara a InsertarNodoInicio QDesEnColar llamara a SacarNodoInicio QFrente llamara a  ConsultarPrimero QFinal llamara a ConsultarUltimo Etc..
COLA: LISTA CONTIGUA Si la lista contigua ya esta implementada Aun con los cambios que dijimos que ibamos a necesitar La cola ya no necesita ser implementada Para implementar las operaciones de la cola Solo llamaremos a las operaciones de la lista ya implementadas bool QEncolar(Cola *Q)( return LSCont_InsertarNodoInicio(Q); } Generico QDesEnColar(Cola *Q){ return LSCont_SacarNodoFinal(Q); } bool QEstaLlena(Cola Q){ return(LSCont_EstaLlena(Q)); } bool QEstaVacia(Cola Q){ return(LSCont_EstaVacia(Q));l } Generico QFrente(Cola Q){ return(LSCont_ConsultarPrimero(Q)); } Generico QFinal(Cola Q){ return(LSCont_ConsultarUltimo(Q)); }
LSCONT: AJUSTANDOSE MEJOR A LA COLA Dijimos, una cola tiene dos extremos Frente y Final Siempre debemos llevar “control” de esas dos posiciones La estructura que definiria el nuevo TDA typedef struct{ ArrayU Datos; int Frente; int Final; } LsCont; Ya no se pueden insertar mas elementos, aunque hay espacio atrás! Cuando la cola recien comienza,  El Frente es el indice inicial del arreglo: 0 El Final, como no hay, es –1 La cola esta vacia Si Frente > Final La cola esta llena Si Final == MAX –1  A medida que se ingresan elementos El Final aumenta Cuando se eliminan El Frente, se mueve hacia delante QDesEncolar(Q); QEnColar(Q,’D’); QEnColar(Q,’E’); QDesEncolar(Q); QEnColar(Q,’F’); QEnColar(Q,’G’); A 0 B 1 C 2 3 4 5 6 MAX = 7 Frente Final 0 B 1 C 2 D 3 E 4 5 6 0 1 C 2 D 3 E 4 F  5 G  6 Frente Final Frente Final
LSCONT: CAMBIOS bool LSCont_InsertarNodoUltimo( LSCont *L,  Generico G){ Generico *gfinal; if(!LSCont_EstaLlena(*L)){ L->Final = L->Final++); gfinal = ArrayU_Seleccionar(L->Datos,   L->Final);  gfinal = G; return TRUE; }else  return FALSE; } Generico LSCont_SacarNodoPrimero(LSCont *L){ Generico tmp_frente; if(!LSCont_EstaVacia(*L)){ tmp_frente = LSCont_ConsultarPrimero(L); q->Frente ++;  return(tmp_frente); } } bool LSCont_EstaLlena(LSCont L){ return(L.Final == MAX-1); } bool LSCont_EstaVacia(LSCont L){ return(L.Frente < L.Final);l } Generico LSCont_ConsultarPrimero(LSCont L){ return(*ArrayU_Seleccionar(L.Datos, L.Frente); } Generico LSCont_ConsultarUltimo(LSCont L){ return(*ArrayU_Seleccionar(L.Datos, L.Final); }
COMO RESOLVER EL PROBLEMA Como vimos esta estrategia no es optima, se desperdicia espacio libre El problema es al DesEnColar elementos Usando arreglos lineales, hay dos posibles soluciones: Retroceder con cada DesEncolamiento Al remover un elemento, no mover el  Frente  hacia delante Mas bien, hacer que todos los elementos retrocedan una posicion Asi no se desperdicia un “puesto” vacio En esta estrategia el  Frente  nunca se mueve,  S iempre es 0 El  Final  disminuye en una posicion Cuando la Cola este Llena, Retroceder Cuando  Final  llegue a su limite, Retroceder todos los elementos hasta el inicio del arreglo El  Frente , que aumento durante el EnColamiento vuelve a ser 0 El  Final  disminuye el numero de “espacios vacios” que habian El Final llego a su limite DesEnCola(q); DesEnCola(q); EnCola(q,’D’); DesEnColar(q); DesEnCola(q); EnColar(q,’E’); A  0 B 1 C 2 D  3 4 A 0 B 1 C 2 3 4 Final Frente Final B  0 C 1 D 2 3 4 Frente Final A 0 B 1 C 2 D  3 4 Final 0 B 1 C 2 D  3 4 Frente 0 1 C 2 D  3 4 Frente 0 1 C 2 D  3 E 4 Final C  0 D 1 E 2 3 4 Frente Final C  0 D 1 2 3 4 Final
ARREGLOS CIRCULARES Sin embargo, ninguna de las anteriores es la ideal Si una cola tiene 1000 elementos, y uno se DesEnCola Hay que mover 999 elementos Es muy poco eficiente El problema del primer enfoque que revisamos era que Cuando el Final llegaba al limite, no se podia seguir avanzando y La Cola aparecia llena y esto no necesariamente era verdadero Imaginemos un arreglo sin ese problema Al recorrer todo arreglo, se hace desde inicio 0, hasta fin MAX-1 ¿Que tal si al recorrer el arreglo, al llegar a  MAX-1, volvemos al primer elemento? Este seria un arreglo circular 0 1 2 3 4 3 1 2 4 0
¿Y COMO FUNCIONARIA? En un arreglo lineal, vimos: Al EnColar, el Final, se mueve hacia el siguiente Al DesEnColar, el Frente, se mueve hacia el siguiente A medida que los elementos se desencolaron y encolaron La cola fue avanzando hacia la derecha El Final ha alcanzado el MAXimo permitido Sin embargo, al inicio del Arreglo, si hay espacios vacios ¿Que hacer? A B C D E G Al encolar el final se mueve al siguiente Al desencolar el frente se mueve al siguiente Deseamos poder utilizar los elementos del inicio del arreglo Para colocar alli a los nuevos elementos Es decir, que una vez que el Final llegue a su limite El Final se pueda mover al inicio En un arreglo lineal, el siguiente del indice 4 es el indice 5 Podemos “asumir” que el siguiente de 4, no es el 5, es 0 3 1 2 4 0 A  0 1 2 3 4 Frente Final A  0 B 1 2 3 4 Final A  0 B 1 C  2 3 4 Final A  0 B 1 C  2 D  3 4 Final 0 B 1 C  2 D  3 4 Frente 0 1 C  2 D  3 4 Frente 0 1 C  2 D  3 E  4 Final Frente Final Final Final Frente Final Frente Final Final
COLA LLENA Y COLA VACIA En un arreglo circular, el siguiente de un indice, se calculara: Si el indice == MAX.-1 entonces siguiente = 0 Si no siguiente = indice+1 Con todo lo visto, ¿que condicion determinará…… B C D E Y que la Cola esta vacia? Suponga una cola con dos elementos Ahora, se desencola uno Al remover el ultimo:  El elemento siguiente del final es el elemento del Frente que la Cola esta llena? El elemento siguiente del Final,  es el elemento del Frente La condicion para Cola Vacia,es igual que para Cola Llena, que hacer? Sacrificar un elemento La cola estara llena no con MAX elementos, sino con MAX -1 Es cuando el elemento siguiente del siguiente del Final, es igual al Frente 1 4 0 2 3 Final Final Final Final 3 1 2 4 0 E D Frente Final Frente Frente A Frente Final
LSCONT: IMPLEMENTACION int Siguiente(int indice, int max){ if(indice == max-1) return 0; return indice+1; } bool LSCont_InsertarNodoFinal(LSCont *L, Generico G) { Generico *elemento; if(!LSCont_EstaLLena(*L)){ L->Final = Siguiente(L->Final); elemento = ArrayU_Datos(L->Datos, L->Final); *elemento = G; return TRUE; } return FALSE; } Generico LSCont_SacarNodoFinal(LSCont *L){ generico tmp_frente; if(!QEstaVacia(q)){ tmp_frente = LSCont_ConsultarPrimero(*L); L->Frente = Siguiente(L->Frente); return(tmp_frente); } return NULL; } bool LSCont_EstaLLena(LSCont L){ return(Siguiente(Siguiente(L.Final))==L.Frente); } bool LSCont_EstaVacia(LSCont *L){ return(Siguiente(L.Final))==L.Frente); } Generico LSCont_CoonsultarPrimero(LSCont L){ return(*ArrayU(L.Datos, L.Frente); } Generico LSCont_CoonsultarUltimo(LSCont L){ return(*ArrayU(L.Datos, L.Final); }
COLA: LISTA ENLAZADA Con al implementacion de  listas enlazadas  Ya no existira para nada el problema de desperdicio de memoria Ni de limites maximo No olvidemos que ya las operaciones de la Cola Llamaran a las de la lista enlazada bool QEncolar(Cola *Q)( return LSE_InsertarNodoInicio(Q); } LSE_nodo * QDesEnColar(Cola *Q){ return LSE_SacarNodoFinal(Q); } bool QEstaVacia(Cola Q){ return(LSE_EstaVacia(Q));l } LSE_nodo* QFrente(Cola Q){ return(LSE_ConsultarPrimero(Q)); } LSE_nodo* QFinal(Cola Q){ return(LSE_ConsultarUltimo(Q)); }
TDA COLAS DE PRIORIDAD En las colas normales Las operaciones estan definidas en funcion del orden de llegada de los elementos Al encolar un elemento ingresa al final de la cola Al desencolar, sale del frente de la cola En una cola, los elementos esperan por ser atendidos Es justo, porque el que llega primero, se atiende primero En una cola de prioridad Prioridad El orden de atencion, no esta dado solo por el orden de llegada Cada elemento, tendra asociado una cierta prioridad Cada elemento sera “procesado”, según su prioridad
TIPOS DE COLAS DE PRIORIDAD Hay dos tipos de colas de prioridad De Prioridad Ascendente EnColar: son encolados arbitrariamente(PQEnColar) DesEnColar: se remueve el elemento mas pequeño de la cola(PQMinDesEncolar) De Prioridad Descendente EnColar: son encolados arbitrariamente DesEnColar: se remueve el elemento mas grande de la cola(PQMaxDesEncolar) Las colas de prioridad pueden contener Enteros, Reales Estructuras,  Estarian ordenadas en base a uno o mas campos
DESENCOLAR EN COLAS DE PRIORIDAD Al  encolar  un elemento en este tipo de cola Se encola al final de los elementos  con la misma prioridad El  desencolar  elementos de una cola Quiere decir, que ese elemento es escogido para ser “atendido” Se elige  el primer elemento  con la  mayor/menor prioriodad En las de prioridad ascendente, por ejemplo Se busca atender primero al de menor valor en toda la cola: BUSCAR Y luego sacarlo Es decir, existe un conjunto de prioridades Cada prioridad tendra un conjunto de elementos que se comportara como una cola
IMPLEMENTACION ESTATICA Usando un arreglo Circular Insertar los elementos ordenadamente a la cola Se usa un arreglo circular La insercion contempla Buscar la posicion correcta para el elemennto Cambiar la posicion de los anteriores o posteriores Al remover, no hay que buscar Se eliminar el primero o el ultimo de la cola Dependiendo el orden del arreglo y  El tipo de cola de prioridad
IMPLEMENTACION ESTATICA: ARREGLOS Las colas de prioridad Son un conjunto de colas Podriamos crear un tipo Cola_Prioridad Que comprenda tanto el numero de la prioridad Como el resto de caracteristicas de una prioridad Y la Cola Luego tendremos un Arreglo de Prioridades typedef struct{ int numero; //todo lo que defina a una prioridad Cola Q; }Cola_Prioridad; Cola_Prioridad CP[10]; Asi, una cola de prioridad i puede acceder A su numero de prioridad: CP[i].numero A la cola en si: CP[i].Q
IMPLEMENTACION DINAMICA: LISTA SIMPLE Mediante una lista simple Cada nodo tendra Contenido, prioridad y enlace con el siguiente La lista se mantiene ordenada por la prioridad Para encolar: Buscar la posicion correcta  La lista debe permanecer ordenada Para desencolar: Eliminar el primer elemento
IMPLEMENTACION DINAMICA Mediante  lista de n colas Las prioridades forman una lista Cada nodo de la lista tiene asociada una cola Al  encolar : Se busca la prioridad del elemento En la cola asociada se inserta al final Al  desencolar : Se busca la prioridad del elemento En la cola asociada, se remueve el primero typedef struct{ //…Informacion  //Prioridad Cola Q; }Cola_Prioridad; o LSE CP;  //Lista de cola de prioridades //Nodo enlazado a una cola LSE_nodo *cviajero; Cola_Prioridad *c; Una cola de la lista puede accederse; c = Generico_ObtenerColaPrioridad(Cviajero->G); c->Q La prioridad y datos de la misma estan en Cviajero->G typedef struct LME_nodo{ Generico G; struct LSE_nodo *sig; Cola Q; }LSE_nodo; LSE CP;   //Lista de cola de priridades //Nodo enlazado a una cola LSE_nodo *cviajero; Una cola de la lista puede accederse; Cviajero->Q La prioridad y datos de la misma estan en  Cviajero->G I11 I12 I13 P1 P2 P3 P4 I41 I42 I21 header last Frente Final

Más contenido relacionado

PPTX
Colas estáticas. IESIT
DOCX
Metodo de la burbuja en algoritmo
PPTX
Colas de prioridad
PPTX
PPTX
Listas
PPTX
Listas Enlazadas
DOCX
Colas estáticas. IESIT
Metodo de la burbuja en algoritmo
Colas de prioridad
Listas
Listas Enlazadas

La actualidad más candente (20)

PPTX
Colas en programacion
PDF
Most 1
PPTX
Heap sort
PPTX
l6_modelos_de_inventario_probabilistico.pptx
PPT
DOCX
5.3 árbol de expansión mínima
PPT
Sql Tutorials
PPTX
Expo busqueda binaria
DOCX
UNA - Metodos cuantitativos (Transporte y Asignacion)
PPTX
Importancia de la implementación de las listas para la estructura de datos
PPTX
Sistema de costos historicos
PDF
Árboles AA
PDF
Estructura de Datos - árboles y grafos
PPTX
Algoritmo Heap Sort
PPT
Listas, pilas y colas
PDF
7. Nested Subqueries.pdf
PPTX
Metodos de ordenacion radix sort
PPT
Clustering
PPTX
PROGRAMACION LINEAL - METODO SIMPLEX
PPTX
Programación 3: árboles binarios y ordenados
Colas en programacion
Most 1
Heap sort
l6_modelos_de_inventario_probabilistico.pptx
5.3 árbol de expansión mínima
Sql Tutorials
Expo busqueda binaria
UNA - Metodos cuantitativos (Transporte y Asignacion)
Importancia de la implementación de las listas para la estructura de datos
Sistema de costos historicos
Árboles AA
Estructura de Datos - árboles y grafos
Algoritmo Heap Sort
Listas, pilas y colas
7. Nested Subqueries.pdf
Metodos de ordenacion radix sort
Clustering
PROGRAMACION LINEAL - METODO SIMPLEX
Programación 3: árboles binarios y ordenados
Publicidad

Destacado (20)

PDF
PDF
46769481 guia-de-investigacion-de-operaciones-i[1]
PPT
PPT
Problema de Asignación
PPT
Problema del Transporte
PPTX
Nivel de abstraccion
PDF
Tutorial de inscripción curso introductorio
DOC
Informe 324
PDF
Concurso Preparador Didácticas Especiales
PDF
Estudiantes EUS CAPITAL inscritos en secretaría
PPT
Estructura de datos.vrb
PDF
Trabajo Practico - Simulación (337) - UNA
PDF
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
PDF
Computación ii 324-1-estructuras dinamicas-con enlaces
PDF
PPTX
Teoria general de sistemas
PDF
Trabajo Practico - Investigación de Operaciones II (348) - UNA
46769481 guia-de-investigacion-de-operaciones-i[1]
Problema de Asignación
Problema del Transporte
Nivel de abstraccion
Tutorial de inscripción curso introductorio
Informe 324
Concurso Preparador Didácticas Especiales
Estudiantes EUS CAPITAL inscritos en secretaría
Estructura de datos.vrb
Trabajo Practico - Simulación (337) - UNA
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
Computación ii 324-1-estructuras dinamicas-con enlaces
Teoria general de sistemas
Trabajo Practico - Investigación de Operaciones II (348) - UNA
Publicidad

Similar a COLAS (20)

PDF
PPTX
PPT
PPT
Presentacion De Cola
PPT
Presentacion De Cola
PPT
Presentacion De Cola
PPTX
Presentacion pilas lista y colas
PPTX
Listas, pilas y colas
PPS
Colas y listas generales
PPTX
Pilas, colas, y listas estructura de datos
PPTX
Pilas y colas
PPTX
Listas cola y_pila.ranli_y_eladio
PPTX
Programación 3: colas
PPTX
PPTX
PPTX
Listas,pilas y colas Estructura de Datos
PPTX
Gilmora
PPT
Estructura de datos.vrb
PPT
Estructura de datos.vrb
Presentacion De Cola
Presentacion De Cola
Presentacion De Cola
Presentacion pilas lista y colas
Listas, pilas y colas
Colas y listas generales
Pilas, colas, y listas estructura de datos
Pilas y colas
Listas cola y_pila.ranli_y_eladio
Programación 3: colas
Listas,pilas y colas Estructura de Datos
Gilmora
Estructura de datos.vrb
Estructura de datos.vrb

Más de Gustavo Salazar Loor (20)

PDF
Max Plus Compilar vhdl
PPT
Electronica I Clase07
PPT
Electronica I Clase07
PPT
Electronica I Clase06
PPT
Electronica I Clase05
PPT
Electronica I Clase04
PPT
Electronica I Clase03
PPT
Electronica I Clase02
PPT
Electronica I Clase01
PPT
ARBOLES MULTICAMINOS
PPT
LISTAS ESPECIALES
PPT
CODIGO DE HUFFMAN
PPT
RESPIRACION Y FERMENTACION
PPT
CODIGO GENETICO
Max Plus Compilar vhdl
Electronica I Clase07
Electronica I Clase07
Electronica I Clase06
Electronica I Clase05
Electronica I Clase04
Electronica I Clase03
Electronica I Clase02
Electronica I Clase01
ARBOLES MULTICAMINOS
LISTAS ESPECIALES
CODIGO DE HUFFMAN
RESPIRACION Y FERMENTACION
CODIGO GENETICO

Último (20)

PDF
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
PDF
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
PDF
Punto Critico - Brian Tracy Ccesa007.pdf
DOCX
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
PDF
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
PDF
Breve historia de los Incas -- Patricia Temoche [Temoche, Patricia] -- Breve ...
PDF
Escuelas Desarmando una mirada subjetiva a la educación
PDF
Escuela Sabática 6. A través del Mar Rojo.pdf
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
Fundamentos_Educacion_a_Distancia_ABC.pdf
PDF
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
PDF
Metodologías Activas con herramientas IAG
PDF
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
PDF
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
PDF
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
PPT
Cosacos y hombres del Este en el Heer.ppt
DOCX
2 GRADO UNIDAD 5 - 2025.docx para primaria
PDF
Híper Mega Repaso Histológico Bloque 3.pdf
PDF
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
PPTX
caso clínico iam clinica y semiología l3.pptx
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
PFB-MANUAL-PRUEBA-FUNCIONES-BASICAS-pdf.pdf
Punto Critico - Brian Tracy Ccesa007.pdf
PROYECTO DE APRENDIZAJE para la semana de fiestas patrias
Salcedo, J. et al. - Recomendaciones para la utilización del lenguaje inclusi...
Breve historia de los Incas -- Patricia Temoche [Temoche, Patricia] -- Breve ...
Escuelas Desarmando una mirada subjetiva a la educación
Escuela Sabática 6. A través del Mar Rojo.pdf
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
Fundamentos_Educacion_a_Distancia_ABC.pdf
Cronograma de clases de Práctica Profesional 2 2025 UDE.pdf
Metodologías Activas con herramientas IAG
Escuela de Negocios - Robert kiyosaki Ccesa007.pdf
GUIA DE: CANVA + INTELIGENCIA ARTIFICIAL
Conecta con la Motivacion - Brian Tracy Ccesa007.pdf
Cosacos y hombres del Este en el Heer.ppt
2 GRADO UNIDAD 5 - 2025.docx para primaria
Híper Mega Repaso Histológico Bloque 3.pdf
Salvese Quien Pueda - Andres Oppenheimer Ccesa007.pdf
caso clínico iam clinica y semiología l3.pptx

COLAS

  • 1. EL TDA COLA Estructuras de Datos
  • 2. DEFINICION Abunda este concepto, en la vida cotidiana Cuando vamos al cine, para comprar las entradas Cuando estamos en el supermercado, en el banco, etc. Como funciona Se puede decir que la cola tiene 2 extremos FRENTE, Y FINAL La computadora las utiliza: Para manejar la impresión de documentos, tiempo compartido, etc. Queue -> Cola Cada documento que se manda a imprimir es “encolado”, uno a uno es enviado a la impresora Frente Final Final Frente Todo el que llega se ubica al final de la cola Todo el que sale, lo hace por el frente de la cola La cola es por turno El primero en llegar, tiene la seguridad de que sera el primero en salir: FIRST IN FIRST OUT -> FIFO
  • 3. OPERACIONES BASICAS Al suponer que existe un TDA Cola, podemos: Cola Q; Todo TDA presenta operaciones basicas, en este caso: EnColar Insertar un elemento nuevo a la cola, al final de la misma, El final aumenta DesEnColar Cuando un elemento es removido de la cola Remueve el elemento del frente Retorna el elemento removido No se puede ejecutar si la cola EstaVacia Asi como en la pila Cualquier intento de acceder a elementos en una Cola Vacia: SUBDESBORDAMIENTO DE LA COLA
  • 4. COLAS: OPERACIONES QVaciar(Cola q) Recibe una cola y la vacia QEliminar(Cola q) Recibe una cola y elimina todos los elementos que en ella existen, para dejarla vacia QEstaVacia(Cola q) Determina si una cola esta vacia o no Frente(Cola q) Devuelve el elemento del frente de la cola Final(Cola q) Devuelve el elemento del final de la cola QDesEnColar(Cola q) Remueve el elemento del frente de la cola Devuelve el elemento removido No se puede remover si esta vacia QEnColar(Cola q, elemento) Inserta el elemento al final de la cola El final aumenta en uno
  • 5. IMPLEMENTACIONES Las colas se pueden implementar de muchas formas Una cola es Un conjunto ordenado de elementos Se supone que no tiene limite en su crecimiento Una cola es una LISTA Por lo tanto, la implementaciones posibles para la cola son Las mismas posibles para la LISTA Contigua(Estatica) Enlazada(Dinamica) Sin embargo, en cada una de las posibles implementaciones Se pueden realizar ciertos cambios que se ajusten mas al concepto de la cola typedef LSCont Cola; typedef LSE Cola;
  • 6. RECORDEMOS ENTONCES.. Que para implementar la Cola Debo decidir sobre que implementacion de lista basarme Las implementaciones de las operaciones de la Cola Solo llaman a las operaciones de las listas QEnColar llamara a InsertarNodoInicio QDesEnColar llamara a SacarNodoInicio QFrente llamara a ConsultarPrimero QFinal llamara a ConsultarUltimo Etc..
  • 7. COLA: LISTA CONTIGUA Si la lista contigua ya esta implementada Aun con los cambios que dijimos que ibamos a necesitar La cola ya no necesita ser implementada Para implementar las operaciones de la cola Solo llamaremos a las operaciones de la lista ya implementadas bool QEncolar(Cola *Q)( return LSCont_InsertarNodoInicio(Q); } Generico QDesEnColar(Cola *Q){ return LSCont_SacarNodoFinal(Q); } bool QEstaLlena(Cola Q){ return(LSCont_EstaLlena(Q)); } bool QEstaVacia(Cola Q){ return(LSCont_EstaVacia(Q));l } Generico QFrente(Cola Q){ return(LSCont_ConsultarPrimero(Q)); } Generico QFinal(Cola Q){ return(LSCont_ConsultarUltimo(Q)); }
  • 8. LSCONT: AJUSTANDOSE MEJOR A LA COLA Dijimos, una cola tiene dos extremos Frente y Final Siempre debemos llevar “control” de esas dos posiciones La estructura que definiria el nuevo TDA typedef struct{ ArrayU Datos; int Frente; int Final; } LsCont; Ya no se pueden insertar mas elementos, aunque hay espacio atrás! Cuando la cola recien comienza, El Frente es el indice inicial del arreglo: 0 El Final, como no hay, es –1 La cola esta vacia Si Frente > Final La cola esta llena Si Final == MAX –1 A medida que se ingresan elementos El Final aumenta Cuando se eliminan El Frente, se mueve hacia delante QDesEncolar(Q); QEnColar(Q,’D’); QEnColar(Q,’E’); QDesEncolar(Q); QEnColar(Q,’F’); QEnColar(Q,’G’); A 0 B 1 C 2 3 4 5 6 MAX = 7 Frente Final 0 B 1 C 2 D 3 E 4 5 6 0 1 C 2 D 3 E 4 F 5 G 6 Frente Final Frente Final
  • 9. LSCONT: CAMBIOS bool LSCont_InsertarNodoUltimo( LSCont *L, Generico G){ Generico *gfinal; if(!LSCont_EstaLlena(*L)){ L->Final = L->Final++); gfinal = ArrayU_Seleccionar(L->Datos, L->Final); gfinal = G; return TRUE; }else return FALSE; } Generico LSCont_SacarNodoPrimero(LSCont *L){ Generico tmp_frente; if(!LSCont_EstaVacia(*L)){ tmp_frente = LSCont_ConsultarPrimero(L); q->Frente ++; return(tmp_frente); } } bool LSCont_EstaLlena(LSCont L){ return(L.Final == MAX-1); } bool LSCont_EstaVacia(LSCont L){ return(L.Frente < L.Final);l } Generico LSCont_ConsultarPrimero(LSCont L){ return(*ArrayU_Seleccionar(L.Datos, L.Frente); } Generico LSCont_ConsultarUltimo(LSCont L){ return(*ArrayU_Seleccionar(L.Datos, L.Final); }
  • 10. COMO RESOLVER EL PROBLEMA Como vimos esta estrategia no es optima, se desperdicia espacio libre El problema es al DesEnColar elementos Usando arreglos lineales, hay dos posibles soluciones: Retroceder con cada DesEncolamiento Al remover un elemento, no mover el Frente hacia delante Mas bien, hacer que todos los elementos retrocedan una posicion Asi no se desperdicia un “puesto” vacio En esta estrategia el Frente nunca se mueve, S iempre es 0 El Final disminuye en una posicion Cuando la Cola este Llena, Retroceder Cuando Final llegue a su limite, Retroceder todos los elementos hasta el inicio del arreglo El Frente , que aumento durante el EnColamiento vuelve a ser 0 El Final disminuye el numero de “espacios vacios” que habian El Final llego a su limite DesEnCola(q); DesEnCola(q); EnCola(q,’D’); DesEnColar(q); DesEnCola(q); EnColar(q,’E’); A 0 B 1 C 2 D 3 4 A 0 B 1 C 2 3 4 Final Frente Final B 0 C 1 D 2 3 4 Frente Final A 0 B 1 C 2 D 3 4 Final 0 B 1 C 2 D 3 4 Frente 0 1 C 2 D 3 4 Frente 0 1 C 2 D 3 E 4 Final C 0 D 1 E 2 3 4 Frente Final C 0 D 1 2 3 4 Final
  • 11. ARREGLOS CIRCULARES Sin embargo, ninguna de las anteriores es la ideal Si una cola tiene 1000 elementos, y uno se DesEnCola Hay que mover 999 elementos Es muy poco eficiente El problema del primer enfoque que revisamos era que Cuando el Final llegaba al limite, no se podia seguir avanzando y La Cola aparecia llena y esto no necesariamente era verdadero Imaginemos un arreglo sin ese problema Al recorrer todo arreglo, se hace desde inicio 0, hasta fin MAX-1 ¿Que tal si al recorrer el arreglo, al llegar a MAX-1, volvemos al primer elemento? Este seria un arreglo circular 0 1 2 3 4 3 1 2 4 0
  • 12. ¿Y COMO FUNCIONARIA? En un arreglo lineal, vimos: Al EnColar, el Final, se mueve hacia el siguiente Al DesEnColar, el Frente, se mueve hacia el siguiente A medida que los elementos se desencolaron y encolaron La cola fue avanzando hacia la derecha El Final ha alcanzado el MAXimo permitido Sin embargo, al inicio del Arreglo, si hay espacios vacios ¿Que hacer? A B C D E G Al encolar el final se mueve al siguiente Al desencolar el frente se mueve al siguiente Deseamos poder utilizar los elementos del inicio del arreglo Para colocar alli a los nuevos elementos Es decir, que una vez que el Final llegue a su limite El Final se pueda mover al inicio En un arreglo lineal, el siguiente del indice 4 es el indice 5 Podemos “asumir” que el siguiente de 4, no es el 5, es 0 3 1 2 4 0 A 0 1 2 3 4 Frente Final A 0 B 1 2 3 4 Final A 0 B 1 C 2 3 4 Final A 0 B 1 C 2 D 3 4 Final 0 B 1 C 2 D 3 4 Frente 0 1 C 2 D 3 4 Frente 0 1 C 2 D 3 E 4 Final Frente Final Final Final Frente Final Frente Final Final
  • 13. COLA LLENA Y COLA VACIA En un arreglo circular, el siguiente de un indice, se calculara: Si el indice == MAX.-1 entonces siguiente = 0 Si no siguiente = indice+1 Con todo lo visto, ¿que condicion determinará…… B C D E Y que la Cola esta vacia? Suponga una cola con dos elementos Ahora, se desencola uno Al remover el ultimo: El elemento siguiente del final es el elemento del Frente que la Cola esta llena? El elemento siguiente del Final, es el elemento del Frente La condicion para Cola Vacia,es igual que para Cola Llena, que hacer? Sacrificar un elemento La cola estara llena no con MAX elementos, sino con MAX -1 Es cuando el elemento siguiente del siguiente del Final, es igual al Frente 1 4 0 2 3 Final Final Final Final 3 1 2 4 0 E D Frente Final Frente Frente A Frente Final
  • 14. LSCONT: IMPLEMENTACION int Siguiente(int indice, int max){ if(indice == max-1) return 0; return indice+1; } bool LSCont_InsertarNodoFinal(LSCont *L, Generico G) { Generico *elemento; if(!LSCont_EstaLLena(*L)){ L->Final = Siguiente(L->Final); elemento = ArrayU_Datos(L->Datos, L->Final); *elemento = G; return TRUE; } return FALSE; } Generico LSCont_SacarNodoFinal(LSCont *L){ generico tmp_frente; if(!QEstaVacia(q)){ tmp_frente = LSCont_ConsultarPrimero(*L); L->Frente = Siguiente(L->Frente); return(tmp_frente); } return NULL; } bool LSCont_EstaLLena(LSCont L){ return(Siguiente(Siguiente(L.Final))==L.Frente); } bool LSCont_EstaVacia(LSCont *L){ return(Siguiente(L.Final))==L.Frente); } Generico LSCont_CoonsultarPrimero(LSCont L){ return(*ArrayU(L.Datos, L.Frente); } Generico LSCont_CoonsultarUltimo(LSCont L){ return(*ArrayU(L.Datos, L.Final); }
  • 15. COLA: LISTA ENLAZADA Con al implementacion de listas enlazadas Ya no existira para nada el problema de desperdicio de memoria Ni de limites maximo No olvidemos que ya las operaciones de la Cola Llamaran a las de la lista enlazada bool QEncolar(Cola *Q)( return LSE_InsertarNodoInicio(Q); } LSE_nodo * QDesEnColar(Cola *Q){ return LSE_SacarNodoFinal(Q); } bool QEstaVacia(Cola Q){ return(LSE_EstaVacia(Q));l } LSE_nodo* QFrente(Cola Q){ return(LSE_ConsultarPrimero(Q)); } LSE_nodo* QFinal(Cola Q){ return(LSE_ConsultarUltimo(Q)); }
  • 16. TDA COLAS DE PRIORIDAD En las colas normales Las operaciones estan definidas en funcion del orden de llegada de los elementos Al encolar un elemento ingresa al final de la cola Al desencolar, sale del frente de la cola En una cola, los elementos esperan por ser atendidos Es justo, porque el que llega primero, se atiende primero En una cola de prioridad Prioridad El orden de atencion, no esta dado solo por el orden de llegada Cada elemento, tendra asociado una cierta prioridad Cada elemento sera “procesado”, según su prioridad
  • 17. TIPOS DE COLAS DE PRIORIDAD Hay dos tipos de colas de prioridad De Prioridad Ascendente EnColar: son encolados arbitrariamente(PQEnColar) DesEnColar: se remueve el elemento mas pequeño de la cola(PQMinDesEncolar) De Prioridad Descendente EnColar: son encolados arbitrariamente DesEnColar: se remueve el elemento mas grande de la cola(PQMaxDesEncolar) Las colas de prioridad pueden contener Enteros, Reales Estructuras, Estarian ordenadas en base a uno o mas campos
  • 18. DESENCOLAR EN COLAS DE PRIORIDAD Al encolar un elemento en este tipo de cola Se encola al final de los elementos con la misma prioridad El desencolar elementos de una cola Quiere decir, que ese elemento es escogido para ser “atendido” Se elige el primer elemento con la mayor/menor prioriodad En las de prioridad ascendente, por ejemplo Se busca atender primero al de menor valor en toda la cola: BUSCAR Y luego sacarlo Es decir, existe un conjunto de prioridades Cada prioridad tendra un conjunto de elementos que se comportara como una cola
  • 19. IMPLEMENTACION ESTATICA Usando un arreglo Circular Insertar los elementos ordenadamente a la cola Se usa un arreglo circular La insercion contempla Buscar la posicion correcta para el elemennto Cambiar la posicion de los anteriores o posteriores Al remover, no hay que buscar Se eliminar el primero o el ultimo de la cola Dependiendo el orden del arreglo y El tipo de cola de prioridad
  • 20. IMPLEMENTACION ESTATICA: ARREGLOS Las colas de prioridad Son un conjunto de colas Podriamos crear un tipo Cola_Prioridad Que comprenda tanto el numero de la prioridad Como el resto de caracteristicas de una prioridad Y la Cola Luego tendremos un Arreglo de Prioridades typedef struct{ int numero; //todo lo que defina a una prioridad Cola Q; }Cola_Prioridad; Cola_Prioridad CP[10]; Asi, una cola de prioridad i puede acceder A su numero de prioridad: CP[i].numero A la cola en si: CP[i].Q
  • 21. IMPLEMENTACION DINAMICA: LISTA SIMPLE Mediante una lista simple Cada nodo tendra Contenido, prioridad y enlace con el siguiente La lista se mantiene ordenada por la prioridad Para encolar: Buscar la posicion correcta La lista debe permanecer ordenada Para desencolar: Eliminar el primer elemento
  • 22. IMPLEMENTACION DINAMICA Mediante lista de n colas Las prioridades forman una lista Cada nodo de la lista tiene asociada una cola Al encolar : Se busca la prioridad del elemento En la cola asociada se inserta al final Al desencolar : Se busca la prioridad del elemento En la cola asociada, se remueve el primero typedef struct{ //…Informacion //Prioridad Cola Q; }Cola_Prioridad; o LSE CP; //Lista de cola de prioridades //Nodo enlazado a una cola LSE_nodo *cviajero; Cola_Prioridad *c; Una cola de la lista puede accederse; c = Generico_ObtenerColaPrioridad(Cviajero->G); c->Q La prioridad y datos de la misma estan en Cviajero->G typedef struct LME_nodo{ Generico G; struct LSE_nodo *sig; Cola Q; }LSE_nodo; LSE CP; //Lista de cola de priridades //Nodo enlazado a una cola LSE_nodo *cviajero; Una cola de la lista puede accederse; Cviajero->Q La prioridad y datos de la misma estan en Cviajero->G I11 I12 I13 P1 P2 P3 P4 I41 I42 I21 header last Frente Final