clase 10 Contenedores Lineales (Colas)

Anuncio
.
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.
Descargar