. Unidad 4: CONTENEDORES LINEALES Tema: COLAS 1. COLAS: DEFINICION 2. EL TAD COLA 3. EL TAD COLA: IMPLEMENTACION CON ARREGLOS 4. EL TAD COLA: IMPLEMENTACION CON LISTAS ENLAZADAS (Apuntes de apoyo a clases teóricas) (Tiempo de exposición 1 h) 1 Bibliografía: 2 1. Seymour Lipschutz. Estructuras de datos. Editorial Mc Graw Hill. Año 1987. 2. Aho, Hopcroft y Ullman. Estructuras de datos y Algoritmos. Editorial Addison Wesley. Año 1988. 3. Luis Joyanes Aguilar. Fundamentos de Programación: Algoritmos y Estructuras de Datos. Editorial Mc Graw Hill .1988. Objetivos de la clase: 3 1. Conceptualizar la estructura de datos lineal COLA. 2. Proponer un TAD COLA: Su diseño, utilización e implementación 3. Con el TAD COLA: realizar la Implementación con Arreglos, proponer una estructura de datos y sus operaciones. 4. Con el TAD COLA: realizar la Implementación con Lista Enlazada, proponer una estructura de datos y sus operaciones. COLA: Campo de Aplicación 4 1. COLAS de autos, cola de un cine, cola de un banco. 2. En Informática, suele haber un procesador central y una serie de periféricos compartidos: discos, impresoras, etc. Los recursos se comparten entre los distintos usuarios y se utiliza una cola para almacenar los programas o las peticiones de los usuarios que esperan su turno de ejecución. El procesador central atiende por riguroso orden de llamada del usuario, por lo tanto todas las llamadas se almacenan en una COLA. 3. COLAS DE PRIORIDADES: en ellas el procesador central no atiende por riguroso orden de llamada, sino que atiende por PRIORIDADES asignadas por el sistema y solo dentro de las peticiones de igual prioridad se producirá una cola. COLA: Definición 5 Es una lista lineal en la cual los elementos solo pueden ser añadidos por un extremo (FINAL) y solo pueden ser eliminados por el otro extremo (FRENTE). COLA en un banco COLA en un cajero También llamada estructura FIFO: First In First Out (primero en entrar, primero en salir) El orden en que los elementos entran a la cola, es el orden en el que la dejan, en contraste con las Pilas. TAD COLA (Nivel de Diseño) 6 Operaciones: x: elemento, COLA: Tipo_Cola 1. Meter(x, COLA): Esta operación agrega el elemento x en la COLA, por el extremo FINAL de ella. Se debe examinar si hay espacio en la COLA para el nuevo elemento, en caso de no haber tendremos la condición de “DESBORDAMIENTO” u “OVERFLOW” 2. Sacar(x, COLA): Esta operación elimina el elemento del FRENTE de la COLA y lo asigna a la var x Se debe examinar si hay por lo menos un elemento en la COLA, si no lo hay tendremos la condición de “SUBDESBORDAMIENTO” o “UNDERFLOW” TAD COLA (Nivel de Diseño…) 7 3. Vaciar (COLA) Esta operación inicializa la COLA en vacía, haciendo que su FRENTE contenga un valor nulo. 4. Llena(COLA) Esta operación devuelve verdadero si no hay espacio en la COLA 5. Vacía (COLA) Esta operación devuelve verdadero si la COLA está vacía 6. Imprimir (COLA) Esta operación muestra el contenido de la COLA Utilización del TAD COLA 8 Con el TAD COLA, vamos a resolver el siguiente problema: Dada una cadena de caracteres que contiene dos subcadenas separadas por un punto, se quiere saber si las subcadenas son iguales. - Cadena: “xyz.xyz” : Iguales(cadena) devolverá Verdadero - Cadena: “xyza.xyz” : Iguales(cadena) devolverá Falso Algoritmo: A cada carácter de la cadena distinto de punto lo metemos en la cola. Cuando ocurra un punto, comenzamos a eliminar de la cola un elemento, a medida que se sigue procesando la cadena: • Si el elemento extraído de la cola no coincide con el elemento actual de la cadena, se deja de procesar la cadena retornando Falso • En caso de la cola este vacía y no se terminó de procesar la cadena, devolverá Falso. • En caso de que la cola esté vacía y se terminó de procesar la cadena, devolverá verdadero. • En caso de que la cola no esté vacía y se terminó de procesar la cadena, devolverá Falso Utilización del TAD COLA 9 Function Iguales(cadena:TipoCadena):boolean; Var car: char; Cola: tipoCola; idem:boolean; i:integer; Begin Idem :=True; i:= 0; N:=Longitud(cadena) Vaciar(Cola); Repeat i:= i+1; If cadena[i]<> “.” then Meter (Cola,cadena[i]); Until cadena[i]=“.”; i:= i +1; While Not Vacia(Cola) and (i<=N) and Idem do Begin Sacar(Cola, car); If cadena[i]<> car then idem:=False else i:=i+1; End; If (i > N) then {se termino la cadena} If Not(Vacía(cola))Then Iguales:=False else Iguales:= True else { no se terminó la cadena} Iguales:= False End; Utilización del TAD COLA:Prueba 10 Function Iguales(cadena:TipoCadena):boolean; Var car: char; Cola: tipoCola; idem:boolean; i:integer; Begin Idem :=True; i:= 0; N:=Longitud(cadena) Vaciar(Cola); Repeat i:= i+1; If cadena[i]<> “.” then Meter (Cola,cadena[i]); Until cadena[i]=“.”; i:= i +1; While Not Vacia(Cola) and (i<=N) and Idem do Begin Sacar(Cola, car); If cadena[i] <> car then idem:=False else i:=i+1; End; If (i > N) then If Not(Vacía(cola)) Then Iguales:=False else Iguales:= True else Iguales:= False End; - Cadena: “xyz.xyz” - Cola Vacia - Cola x - Cola x y - Cola x y - Cola y z - Cola z - Cola Vacia Iguales:=True z Utilización del TAD COLA:Prueba 11 Function Iguales(cadena:TipoCadena):boolean; Var car: char; Cola: tipoCola; idem:boolean; i:integer; Begin Idem :=True; i:= 0; N:=Longitud(cadena) Vaciar(Cola); Repeat i:= i+1; If cadena[i]<> “.” then Meter (Cola,cadena[i]); Until cadena[i]=“.”; i:= i +1; While Not Vacia(Cola) and (i<=N) and Idem do Begin Sacar(Cola, car); If cadena[i] <> car then idem := False else i:=i+1 End; If (I > N) then If Not(Vacía(cola))then Iguales:=False else Iguales:= True else Iguales:= False End; - Cadena: “xyza.xyz” - Cola Vacia - Cola x - Cola x y - Cola x y z - Cola x y z - Cola y z a - Cola z a - Cola a Iguales:=False a TAD COLA: Nivel de Implementación 12 Con Arreglos o Arrays COLA Implementación o representación en Memoria Con Listas Enlazadas (Punteros) IMPLEMENTACION DE COLAS: Con Arreglos ó Array 13 Estructura de Datos: Para almacenar una COLA, necesitaremos un registro con 3 campos: Frente: Es un número que indica la posición del primer elemento ingresado Final: Es un número que indica la posición del último elemento ingresado Elementos: Es un arreglo o array de elementos de la COLA Esquemáticamente: Ejemplo: Elementos Elementos … Frente Final Long_max x Frente y z Final … Long_max IMPLEMENTACION DE COLAS: Con Arreglos ó Array … Declaraciones en Pascal de esta estructura: 14 Const long_max = 100; { es un límite apropiado de elementos} Type Tipo_elemento = char; { será una lista de caracteres } COLA = Record elementos : Array [1.. Long_max] of Tipo_elemento; Frente: Integer; Final: Integer; End; IMPLEMENTACION DE COLAS: Con Arreglos ó Array 15 Casos que se pueden presentar en la inserción: 1) Cola está vacía: Cola luego de meter Elementos Elementos … x Frente=0 Final = 0 … Frente=1 Final = 1 (Hicimos Frente := 1 Final:= Final+1) 2) Cola está llena: Elementos x Frente=1 y z a … v Final=Long_max Mensaje: Desbordamiento!!! IMPLEMENTACION DE COLAS: Con Arreglos ó Array 16 Casos que se pueden presentar en la inserción: 3) Cola con elementos Cola luego de meter Elementos x Frente=1 y z Elementos … x Final = 3 (Final < Long_max) y Frente=1 z a … Final = 4 (Final:= Final+1) 4) Cola con elementos Elementos z Frente=3 a … v Final=Long_max Desborde? Solución? Cola Circular IMPLEMENTACION DE Colas: Con Arreglos ó Array 17 Operaciones (No circular) 1. Meter (x:Tipo_elemento, C: COLA): Procedure Meter (x: Tipo_elemento, Var C:COLA); Begin If C.Final = long_max then writeln(‘Desborde: COLA llena’) Else Begin If (C.Frente = 0) then C.Frente :=1; {la cola estaba vacía} C.Final := C.Final + 1 C.elementos[C.Final] := x; End; End; IMPLEMENTACION DE COLAS: Con Arreglos ó Array 18 Casos que se pueden presentar en la eliminación: 1) Cola está vacía: Elementos … Mensaje: Sub_desbordamiento!!! Frente=0 Final = 0 Cola luego de sacar 2) Cola está llena: Elementos Elementos x Frente=1 y z a … v Final=Long_max y z a … v Frente=2 (Frente:= Frente+1) Final = Long_max IMPLEMENTACION DE COLAS: Con Arreglos ó Array 19 Casos que se pueden presentar en la eliminación: 3) Cola con 1 elemento Cola luego de sacar Elementos x Frente=1 Final = 1 (Frente = Final) Elementos … Frente=0 Final = 0 IMPLEMENTACION DE Colas: Con Arreglos ó Array 20 2. Sacar (x:tipo_elemento, VAR C:COLA): Si no hay elementos invocamos a una rutina de error. Si hay elementos asignamos a x el valor que se encuentra al Frente de la COLA y luego actualizamos la variable Frente Procedure Sacar (Var x:Tipo_elemento; Var C:COLA); Begin If (C.Frente = 0) then writeln(‘error: COLA vacía’) Else Begin x := C.elementos[C.Frente]; If (C.Frente = C.Final) then {cola con 1 elemento} Else C.Frente :=0, C.Final:= 0; C.Frente := C.Frente + 1; End; End; IMPLEMENTACION DE COLA: Con Arreglos ó Array 21 Para finalizar la implementación de la COLA con arreglos, se deja como ejercicio la implementación de las operaciones: Vaciar(COLA), Llena(COLA), Vacia(Cola), Imprimir(COLA) para hacer ejecutable el procedimiento Iguales(cadena) Se sugiere en las clases prácticas diseñar Unidades del Lenguaje Pascal para especificar el TAD COLA y luego un programa que las utilice. IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 22 Esquemáticamente: la COLA … Nil Frente Primer elemento en ingresar, Primero en salir Último elemento en ingresar, último en salir Ejemplo: COLA Vacía : Nil Frente 5 Meter(5,COLA) : Nil Frente Meter(1,COLA) : 5 1 Nil Frente Para aumentar la eficiencia de Meter, se puede mantener un puntero al último elemento de la cola (Final) , además del puntero Frente. IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 23 Esquemáticamente: la COLA con dos punteros … Nil Frente COLA Vacía : Nil Frente Nil Final 5 Meter(5,COLA) : Frente Meter(1,COLA) : Nil Nuevo 5 Frente Final Final 1 Nuevo Nil Final IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 24 Estructura de Datos: Para almacenar una COLA representada por una lista enlazada, necesitaremos: - La estructura de un nodo: un registro, con dos campos (dato y enlace) - El Frente y final de la cola: variables del tipo nodo. Declaraciones en Pascal para esta estructura: 24 Type Nodo = Record dato: Tipo_elemento; sig: ^Nodo End; COLA = ^Nodo; VAR Frente, Final : COLA; IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 25 Algunas operaciones sobre esta estructura: 1. Imprime(Frente, Final:COLA): Recorre la COLA mostrando sus elementos. Procedure Imprime(Frente, Final: COLA); Var i: ^Nodo; Begin i := Frente {inicio de la COLA} While ( i<> Nil ) do begin writeln(i^.dato ); i := i^.sig; End; End 5 5 1 9 Frente i i i i X IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 26 2. Vacia(Frente, Final:COLA): Testea si la COLA está vacía Function Vacia(Frente, Final:COLA): Boolean Begin If Frente = Nil then Vacia := True else Vacia := False; End; Nil Frente y final IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 27 3. Meter (x:Tipo_elemento, Var Frente, Final:COLA): Casos: a) La COLA está vacía Luego de la inserción: x Nil Frente y Final Nil Frente y final b) La COLA tiene elementos: La inserción se realiza SIEMPRE al FINAL de la lista: 5 1 Final Nil Frente x Nil nuevo IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 28 3. Meter(x:Tipo_elemento; Var Frente, Final:COLA) Procedure Meter(x: Tipo_Elemento; Var Frente, Final: COLA); Var nuevo: COLA; Begin New(nuevo); Nuevo^.dato := x; Nuevo^.sig := Nil; If (Frente = Nil) and (Final = Nil) then Begin Frente := Nuevo; Final := Nuevo End Else Final^.Sig := Nuevo; Final := Nuevo End; IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 29 Pruebas de Meter según los distintos casos: Procedure Meter(x: Tipo_Elemento; Var Frente, Final: COLA); Var nuevo: COLA; Begin New(nuevo); a) La End; Nuevo^.dato := x; Nuevo^.sig := Nil; If (Frente = Nil) and (Final = Nil) then Begin Frente := Nuevo; Final := Nuevo End Else Final^.Sig := Nuevo; Final := Nuevo lista L está vacía: Nil Frente y Final x Frente y final Nil Nuevo IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 30 Pruebas de Meter según los distintos casos: Procedure Meter(x: Tipo_Elemento; Var Frente, Final: COLA); Var nuevo: COLA; Begin New(nuevo); a) La End; Nuevo^.dato := x; Nuevo^.sig := Nil; If (Frente = Nil) and (Final = Nil) then Begin Frente := Nuevo; Final =: Nuevo End Else Final^.Sig := Nuevo; Final := Nuevo lista L está vacía: 5 Nil Frente Final 1 Nil Nuevo IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 31 4. Sacar (Var x:Tipo_elemento, Var Frente, final:COLA): Casos: a) La COLA está vacía Nil No se puede eliminar !!! Frente = Final = Nil b) La COLA tiene elementos: La eliminación se realiza SIEMPRE por el FRENTE de la COLA: 6 1 9 Nil Frente Final IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 32 4. Sacar(Var x:Tipo_elemento; Var Frente, Final:COLA) Procedure Sacar(Var x: Tipo_Elemento; Var Frente, Final:COLA); Var i: COLA; Begin If Frente <> Nil then Begin i := Frente; x := i^.dato; Frente := Frente^.sig; Dispose(i); If Frente = Nil then Final := Nil End Else Writeln (‘Cola Vacía’); End; IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 33 Pruebas de Sacar según los distintos casos: Procedure Sacar(Var x: Tipo_Elemento; Var Frente, Final:COLA); Var i: COLA; Begin If Frente <> Nil then Begin i := Frente; x := i^.dato; Frente := Frente^.sig; Dispose(i); If Frente = Nil then Final := Nil End Else Writeln (‘Cola Vacía’); End; 1 NIL Frente Frente = Nil Final = Nil i Final IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 34 Pruebas de Sacar según los distintos casos: Procedure Sacar(Var x: Tipo_Elemento; Var Frente, Final:COLA); Var i: COLA; Begin If Frente <> Nil then Begin i := Frente; x := i^.dato; Frente := Frente^.sig; Dispose(i); If Frente = Nil then Final := Nil End Else Writeln (‘Cola Vacía’); End; 5 1 9 Frente i Final X IMPLEMENTACION DE COLA: Con Listas Enlazadas (Punteros) 35 Para finalizar la implementación de la COLAs con Punteros, se deja como ejercicio la implementación de las demás operaciones para hacer ejecutable el procedimiento Iguales(cadena) Se sugiere en las clases prácticas diseñar Unidades del Lenguaje Pascal para especificar el TAD COLA y luego un programa que las utilice. Para finalizar la clase de hoy …. 36 Repasemos lo visto: 1. Conceptualizamos el mecanismo de funcionamiento de la COLA 2. El TAD COLA: Su diseño, utilización e implementación 3. El TAD COLA :Implementación con Arreglos: estructura de datos y sus operaciones. 4. El TAD COLA: Implementación con Lista Enlazada (Punteros): estructura de datos y sus operaciones.