Professional Documents
Culture Documents
Departamento de informtica
Campus de Segovia
Estructura de datos
Tema 3: El TAD Lista lineal
NDICE
Implementacin con estructuras estticas Implementacin con variables dinmicas El TAD lista enlazada Operaciones para lista enlazada ordenada
*Inicia (Lista )
Localiza (Lista, Elemento) Recupera (Lista, Posicion)
* Constructores
TAD E IMPLEMENTACIN
En este punto hay que marcar la distincin entre un TAD y la naturaleza de su implementacin. Ambos conceptos pueden considerarse de forma esttica o dinmica. Ej: 1. Una variable de tipo array es una estructura esttica, pero puede almacenarse en memoria de forma esttica (declarada en la zona de declaracin de variables) o de forma dinmica (variables dinmicas). 2. Una pila o una lista son por naturaleza dinmicas pero pueden implementarse con asignacin de memoria esttica (dentro de un array) o con asignacin de memoria dinmica (variables dinmicas y punteros).
IMPLEMENTACIN ESTTICA
unit LEstatic; interface const Max = ...; {especifica tamao mximo lista} type tInfo = ...;{tipo de campo de informacin lista} Lista = record Elementos: array [1..Max] of tInfo; Ultimo: integer end; Posicion = 0 .. Max; procedure Inicia (var L: Lista); function Localiza (L: Lista; E: tInfo): Posicion; procedure Recupera (L: Lista; P:Posicion; var E: tInfo); procedure Inserta (var L: Lista; P:Posicion; E: tInfo); procedure SuprimeDir (var L: Lista; P: Posicion); procedure Modifica (var L: Lista; P: Posicion; E: tInfo);
IMPLEMENTACIN ESTTICA
implementation procedure Inicia; begin L.Ultimo := 0 end; function Localiza; var Q: Posicion; Lc: boolean; begin Q := 1; Lc := false; while (Q <= L.Ultimo) and not Lc do begin Lc := L.Elementos [Q] = E; if not Lc then Q := Q + 1 end; if Lc then Localiza := Q else Localiza := 0 end;
IMPLEMENTACIN ESTTICA
implementation (contina...) procedure Error (n: integer); {procedimiento oculto que slo se ve en el mdulo} begin case n of 1: writeln (Error: posicin no existe); 2: writeln (Error: lista llena. No se pueden aadir elementos); 3: writeln (Error: lista vaca. No se pueden suprimir o modificar elementos); end; {case} readln {Pausa} end; procedure Recupera; begin if (P > L.Ultimo) or (P < 1) then Error (1) else E := L.Elementos [P] end;
IMPLEMENTACIN ESTTICA
implementation (contina...) procedure Inserta; var Q: Posicion; begin if L.Ultimo = Max then Error (2) else if (P > L.Ultimo) or (P < 1) then Error (1) else begin for Q := L.Ultimo downto P do L.Elementos [Q + 1] := L.Elementos [Q] ; L.Ultimo := L.Ultimo + 1; L.Elementos [P] := E end end; procedure Suprime; var Q: Posicion; begin if L.Ultimo = 0 then Error (3) else if (P > L.Ultimo) or (P < 1) then Error (1) else begin L.Ultimo := L.Ultimo 1; for Q := P to L.Ultimo do L.Elementos [Q] := L.Elementos [Q+1] end end;
IMPLEMENTACIN ESTTICA
implementation (contina...) procedure Modifica; begin if L.Ultimo = 0 then Error (3) else if (P > L.Ultimo) or (P < 1) then Error (1) else L.Elementos [P] := E end; end.
IMPLEMENTACIN DINMICA
Las desventajas de la implementacin anterior son: a) Estructura rgida. Insercin y supresin desplazando el resto del array. b) No se utiliza de forma ptima la memoria. Hay que reservar espacio en memoria para toda la estructura durante toda la ejecucin. Estos inconvenientes pueden solucionarse utilizando variables dinmicas. Los elementos de la lista dinmica se definen como datos de tipo registro con, al menos, dos componentes: 1. Almacn del dato de la lista. 2. Puntero, que almacena la posicin de memoria del siguiente elemento de la lista o nil si es el ltimo elemento.
function Localiza; begin while (L^.Sig < > nil) and (L^.Info < > E) do L := L^.Sig; if L^.Info < > E then Localiza := nil else Localiza := L end;
L^.Sig
E
L
implementation (contina ...) procedure Inserta; {Inserta en L un nodo con el var A: Ptrnodo; campo E, delante del nodo de begin direccin P} A^.Sig = nil L=A new (A); A^.Info := E; E a) if (L = nil) then L := A {si L vaca} else if P = L then {si P primer nodo} begin L=P A^.Sig := P; b) A L := A A^.Sig = P end E else begin {si P es oto nodo, A entre anterior y P} c) Anterior (P, L)^.Sig := A; A^.Sig := P end end;
????
Anterior (P,L)^.Sig:=P^.Sig
Operaciones de direccin:
- Siguiente (P, L) - Anterior (P, L) - ltimo (L)
function Siguiente; begin if EsVacia (L) or (P = nil) then P Siguiente := nil else Siguiente := P^.Sig end; function Ultimo; begin if EsVacia(L) then Ultimo := nil else begin while (L^.Sig<>nil) do L := L^.Sig; Ultimo := L; end end;
P^.Sig
L L^.Sig = nil
function Crea (E: tInfo): Ptr; var N: Ptr; begin N^.Sig = nil N new (N); N^.Info := E; E N^.Sig := nil; Crea := N end; procedure Inserprim; var A: Ptr; L begin E A := Crea (E); A A^.Sig := L; L L := A A end;
E
A^.Sig = L
implementation (contina...) procedure Inserfin; L var A: Ptr; begin L A := Crea (E); if EsVacia (L) then Ultimo(L)^.Sig=A E L := A else Ultimo(L)^.Sig := A; end; procedure Suprime; L var A: Ptr; ??? begin L A := Localiza(E, L); ??? if A<>nil then begin if A = L then L := L^.Sig {primer nodo} else Anterior (A, L)^.Sig := A^.Sig; dispose(A) end {if} end;
function Buscorden (E: tInfo; L: Ptr): Ptr; begin while (L^.Sig <> nil) and (L^.Info < E) do L := L^.Sig; if L^.Info = E then Buscorden := L else Buscorden := nil end; El resto de operaciones son iguales a las listas no ordenadas. Cambiar las llamadas a Localiza por Buscorden.
Universidad de Valladolid
Departamento de informtica
Campus de Segovia
Estructura de datos
Tema 3: TAD Pila
NDICE
Definicin Especificacin Implementacin esttica Implementacin dinmica Aplicaciones de pilas Esquema recursivo
TAD Pila
EL TAD PILA
- Una pila es una lista (estructura dinmica) de elementos en la que todas las inserciones y supresiones se realizan por el mismo extremo de la lista. - La caracterstica de esta estructura de datos es que el primer elemento obtenido es el ltimo que se ha introducido; motivo por el que se conoce como estructura Lifo (Last in first out). - Se utiliza siempre que se quiere recuperar una serie de elementos en orden inverso a como se introdujeron. - Ejs.: pila de platos, de libros, etc.
EL TAD PILA
Especificacin informal:
TAD pila (VALORES: pila de elementos; OPERACIONES: Inicia, EsVacia, Apilar, Desapilar, Cima) Inicia ( ) Pila Efecto: Devuelve una pila vaca. EsVacia (Pila) Boolean Efecto: Devuelve true si la pila est vaca y false en caso contrario. Apilar (Pila, Elemento) Pila Efecto: Devuelve una pila resultado de poner el elemento en la cima de la pila. Excepcin: Que la pila est llena. Desapilar (Pila) Pila Efecto: Devuelve la Pila sin el elemento de la cima. Excepcin: Si la Pila est vaca produce error. Cima (Pila) Elemento Efecto: Devuelve el Elemento cima de la Pila. Excepcin: Si la Pila est vaca produce error.
EL TAD PILA
Especificacin formal:
TAD pila (VALORES: pila de elementos; OPERACIONES: Inicia, EsVacia, Apilar, Desapilar, Cima) Sintaxis:
*Inicia ( )
EsVacia (Pila) *Apilar (Pila, Elemento) Desapilar (Pila) Cima (Pila) Semntica: EsVacia (Inicia ( )) EsVacia (Apilar (P, E)) Cima (Inicia ( )) Cima (Apilar (P, E)) Desapilar (Inicia ( )) Desapilar (Apilar (P, E)) * Constructores
IMPLEMENTACIN ESTTICA
unit PEstatic; interface const Max = ...; {especifica tamao mximo lista} type tInfo = ...;{tipo de campo de informacin lista} Pila = record Elementos: array [1..Max] of tInfo; ultimo: integer end; procedure Inicia (var P: Pila); function EsVacia (P: Pila): Boolean; procedure Apilar (var P: Pila; E: tInfo); procedure Desapilar (var P: Pila); procedure Cima (P: Pila; var E: tInfo);
IMPLEMENTACIN ESTTICA
implementation procedure Inicia; begin P.ultimo := 0 end; function EsVacia; begin EsVacia:= P.ultimo = 0; end; procedure Error (n: integer); {procedimiento oculto que slo se ve en el mdulo} begin case n of 1: writeln (Error: Pila llena.); 2: writeln (Error: Pila vaca.); end; {case} readln end;
IMPLEMENTACIN ESTTICA
implementation (contina...)
procedure Apilar; begin if P.ultimo = Max then Error (1) else begin P.ultimo := P.ultimo +1; P.Elementos [P.ultimo] := E end end; procedure Desapilar; begin if EsVacia (P) then Error (2) else P.ultimo := P.ultimo - 1; end; procedure Cima; begin if EsVacia (P) then Error (2) else E := P.Elementos [P.ultimo] end;
IMPLEMENTACIN DINMICA
La pila ser un puntero a un nodo, puntero que seala el extremo de una lista enlazada por el que se efectan las operaciones de manejo de la pila:
P
aux P
aux
1 (1)
(2)
(3)
15 8
A) ELIMINAR LA RECURSIVIDAD
En cada llamada se aade una tabla de activacin en una pila denominada recursiva. En esta pila se almacenan los argumentos y objetos locales con su valor en el momento de producirse la llamada. La recursividad se puede implementar mediante una unidad pila. Bajo esta perspectiva la recursividad se convierte en un par de bucles. El primero apila, el segundo desapila y evala.
EJEMPLO: FACTORIAL DE n
function factorial (n: word): real; var pila: Ptr; i: word; fac: real; begin Inicia (pila); {primer bucle: apila las distintas llamadas} for i := n downto 1 do Apilar (i, pila); {Segundo bucle: resuelve las llamadas} fac:=1 {caso base} while pila < > nil do begin fac := Cima(pila) * fac; Desapilar(pila) function factorial (n: word): real; end; begin factorial := fac if n = 0 then factorial :=1 end; else factorial := n*factorial (n-1)
end;
((A+B)-((C*D) /(A-B)))
b) Se calculara el valor expresin sustituyendo los correspondientes valores, respetando el orden de operacin.
IMPLEMENTACIN PILAS
procedure Desapilar (var P: Ptr; var E: tInfo); var aux: Ptr; begin if not EsVacia (P) then begin E := P^.Info; aux := P; P:= P^.Sig; dispose (aux); end else writeln (Error: Pila vaca) end;
Universidad de Valladolid
Departamento de informtica
Campus de Segovia
Estructura de datos
Tema 3:TAD cola
NDICE
Definicin Especificacin del TAD Implementaciones estticas Implementacin dinmica Esquemas recursivos
EL TAD COLA
- Una cola es una lista de elementos, en la cual las eliminaciones se realizan por el frente o principio de la cola, y los nuevos elementos son aadidos por el otro extremo, llamado fondo o final de la cola. - En esta estructura el primer elemento que entra es el primero en salir, por eso se les llama listas Fifo (First in, first out). - Ejs.: espectadores esperando en la taquilla de un cine, tareas a realizar por una impresora, etc. - Las colas son estructuras de datos dinmicas.
EL TAD COLA
Especificacin informal:
TAD cola (VALORES: cola de elementos; OPERACIONES: Inicia, EsVacia, Primero, Encolar, Desencolar); Inicia ( ) Cola Efecto: Devuelve una cola vaca. EsVacia (Cola) Boolean Efecto: Devuelve true si la cola est vaca y false en caso contrario. Primero (Cola) Elemento Efecto: Devuelve el Elemento Frente de la cola. Excepcin: Si la Cola est vaca produce error. Encolar (Cola, Elemento) Cola Efecto: Aade un nuevo Elemento a la Cola por el Final. Excepcin: Que la cola est llena. Desencolar (Cola) Cola Efecto: Elimina el elemento Frente de la cola. Excepcin: Si la Cola est vaca produce error.
EL TAD COLA
Especificacin formal:
TAD cola (VALORES: cola de elementos; OPERACIONES: Inicia, EsVacia, Primero, Encolar, Desencolar) Sintaxis:
*Inicia ( )
EsVacia (Cola) Primero (Cola, Elemento)
*Encolar (Cola)
Desencolar (Cola) Semntica: EsVacia (Inicia ( )) EsVacia (Poner (Cola, E)) Primero (Inicia ( )) Primero (Encolar (Cola, E))
true false error si EsVacia (Cola) entonces E si_no Primero (Cola) Desencolar (Inicia ( )) error Desencolar (Encolar (Cola, E)) si EsVacia (Cola) then Inicia ( ) si_no Encolar (Desencolar (Cola), E)
IMPLEMENTACIN ESTTICA
unit CEstatic; interface const Max = ...; {especifica tamao mximo lista} type Posicion = 0..Max; tInfo = ...; {tipo de campo de informacin lista} Cola = record Elementos: array [1..Max] of tInfo; frente, final: Posicion end; procedure Inicia (var C: Cola); function EsVacia (C: Cola): boolean; procedure Primero (C: Cola; var E: tInfo); procedure Encolar (var C: Cola; E: tInfo); procedure Desencolar (var C: Cola);
IMPLEMENTACIN ESTTICA
implementation procedure Inicia; begin C.frente := 1; C.final := 0 end; function EsVacia; begin EsVacia := C.final < C.frente end; function EsLlena (C: Cola): boolean; begin EsLlena := C.final = Max end; procedure Primero; begin if not EsVacia (C) then E := C.Elementos [C.frente] end;
IMPLEMENTACIN ESTTICA
implementation (contina...) procedure Encolar; begin if not EsLlena (C) then with C do begin final := final +1; Elementos [final] := E end end; procedure Desencolar; begin if not EsVacia (C) then begin for i:= 1 to C.final-1 do C.Elementos [i] := C.Elementos [i+1]; C.final:=C.final-1; end end; end.
IMPLEMENTACIN CIRCULAR
unit CCEstatic; interface const long = ...; {especifica tamao mximo lista} type Posicion = 0..long; tInfo = ...; {tipo de campo de informacin lista} Cola = record Elementos: array [1..long] of tInfo; frente, final: Posicion end; procedure Inicia (var C: Cola); function EsVacia (C: Cola): boolean; function Primero (C: Cola): tInfo; procedure Encolar (E: tInfo; var C: Cola); procedure Desencolar (var C: Cola);
Es preferible esta implementacin porque no se desplazan los elementos del array, al suprimir el primer elemento de la cola, como ocurre en la implementacin lineal.
uses Ucola; ... procedure X (var C); var elem: tInfo; begin if not EsVacia (C) then begin elem := Primero (C); Desencolar (C, elem) Desencolar (C); Operacin (elem); X (C); Encolar (C, elem); end end;