You are on page 1of 68

Universidad de Valladolid

Departamento de informtica
Campus de Segovia

Estructura de datos
Tema 3: El TAD Lista lineal

Prof. Montserrat Serrano Montero

NDICE

El TAD lista lineal

Implementacin con estructuras estticas Implementacin con variables dinmicas El TAD lista enlazada Operaciones para lista enlazada ordenada

EL TAD LISTA LINEAL


Conjunto de valores: - Una lista es una secuencia elementos de un determinado tipo la lista es homognea. (a1, a2, a3, ..., an) donde n 0, si n = 0, la lista es vaca. - Los elementos de una lista tienen la propiedad de estar ordenados de forma lineal, segn las posiciones que ocupan. ai precede a ai+1 para i = 1, 2, 3, ..., n1 ai sucede a ai-1 para i = 2, 3, 4, ..., n (significa que cada elemento tiene un nico predecesor, excepto el primero, y un nico sucesor, excepto el ltimo)

EL TAD LISTA LINEAL


Observaciones: - La lista es una estructura dinmica desde el punto de vista lgico, ya que su longitud depender del nmero de elementos que tenga, aumentar al insertar y se reducir al suprimir. - El TAD lista puede implementarse de formas esttica o dinmica. - Igualmente, considerar las operaciones bsicas depende de: a) La implementacin elegida para las listas b) El problema que se va a resolver.

EL TAD LISTA LINEAL


Especificacin informal: Sintaxis
Semntica
TAD lista (VALORES: secuencia de elementos; OPERACIONES: Inicia, Localiza, Recupera, Inserta, SuprimeDir, Modifica) Inicia (Lista) Lista Efecto: Devuelve una lista vaca. Localiza (Lista, Elemento) Posicion Efecto: Devuelve la posicin donde est el Elemento de la Lista. Si no est, devuelve nulo. Recupera (Lista, Posicin) Elemento Efecto: Devuelve el Elemento que est en la Posicin. Excepcin: Que la posicin no sea un ndice de la Lista. Inserta (Lista, Posicin, Elemento) Lista Efecto: Devuelve la Lista despus de aadir el Elemento en la Posicin. Excepciones: Que la posicin no sea un ndice de la Lista, que la Lista est llena. SuprimeDir (Lista, Posicion) Lista Efecto: Devuelve la lista sin el elemento de la Posicin especificada. Excepciones: Que la posicin no sea un ndice de la Lista, que la Lista sea vaca. Modifica (Lista, Posicion, Elemento) Lista Efecto: Devuelve la lista con el nuevo Elemento en la Posicin especificada. Excepciones: Que la Posicin no sea un ndice de la Lista, que la Lista sea vaca.

EL TAD LISTA LINEAL


Especificacin formal:
TAD lista (VALORES: secuencia de elementos; OPERACIONES:Inicia, Localiza, Recupera, Inserta, SuprimeDir, Modifica) Sintaxis:

*Inicia (Lista )
Localiza (Lista, Elemento) Recupera (Lista, Posicion)

Lista Posicion Elemento

*Inserta (Lista, Posicion, Elemento) Lista


SuprimeDir (Lista, Posicion) Lista Modifica (Lista, Posicion, Elemento) Lista Semntica: SuprimeDir (Inicia (Lista )) error SuprimeDir (Inserta (L, P, E), P) L Modifica (Inicia (Lista ), P, E) error Modifica (Inserta (L, P, E), P, E1) Inserta (L,P,E1)

* 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.

EL TAD LISTA ENLAZADA


Una lista dinmica simple se llama lista enlazada. Cada uno de los elementos de una lista dinmica se llaman nodos. El nmero de nodos puede variar rpidamente en un proceso, aumentando por insercin de nodos o disminuyendo por supresin de nodos. Una lista enlazada es aquella en la que el orden de las componentes se determina mediante un campo enlace explcito en cada nodo. Las operaciones sobre una lista enlazada permiten acceder a la misma mediante un puntero externo, que contiene la direccin del primer nodo de la lista.

TAD LISTA IMPLEMENTADO CON LISTAS ENLAZADAS


unit LDinami; interface type tInfo = ...;{tipo de campo de informacin lista} Ptr = ^Nodo; {Excepcin a la regla de que los identificadores deben definirse Nodo = record antes de usarse. El tipo Ptr se Info: tInfo; define como un puntero a un registro del tipo Nodo, el cual no Sig: Ptr ha sido an definido.} end; procedure Inicia (var L: Ptr); function Localiza (L: Ptr; E: tInfo): Ptr; procedure Recupera (L: Ptr; P: Ptr; var E: tInfo); procedure Inserta (var L: Ptr; P: Ptr; E: tInfo); procedure SuprimeDir (var L: Ptr; P: Ptr); procedure Modifica (L: Ptr; P: Ptr; E: tInfo);

TAD LISTA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation procedure Inicia; begin L := nil end;

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

TAD LISTA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation (contina ...) procedure Recupera; begin if not (L=nil) then if (P < > nil) then E := P^.Info end; function Anterior (P: Ptr; L: Ptr): Ptr; {El anterior de lista vaca, de direccin no existente y del primer nodo de la lista, devuelve nil} begin if (L = nil) or (P = nil) or (L = P) then Anterior := nil else begin while (L^.Sig<>P) and (L^.Sig<>nil) do L := L^.Sig; if L^.Sig = P then Anterior := L else Anterior := nil L L^.Sig = P end {else} end;

TAD LISTA IMPLEMENTADO CON LISTAS ENLAZADAS


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

TAD LISTA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation (contina ...) procedure SuprimeDir; begin if P = L then {Primer nodo} begin L := L^.Sig; P=L dispose (P) ???? end else if Anterior (P, L) < > nil then begin {Enlaza anterior con siguiente} Anterior (P, L)^.Sig := P^.Sig dispose (P) L end end; procedure Modifica; begin if not (L = nil) then if (P < > nil) then P^.Info := E end; end.

????

Anterior (P,L)^.Sig:=P^.Sig

CLASIFICACIN OPERACIONES DE TAD LISTA ENLAZADA


Iniciar una lista enlazada:
- Inicia (L) - EsVacia(L)

Bsqueda en una lista:


- Localiza (E, L) - Existe (E, L)

Operaciones de direccin:
- Siguiente (P, L) - Anterior (P, L) - ltimo (L)

Insercin de un elemento en la lista:


- Inserprim (E, L) - Inserta (E, P, L) - Inserfin (E, L)

Supresin de un elemento de una lista:


- Suprime (E, L) - SuprimeDir (P, L) - Anula (L)

Recorrido de una lista:


- Visualiza (L)

ALGUNAS OPERACIONES DEL TAD LISTA ENLAZADA


EsVacia (L): Funcin que determina si L es vaca o no. Existe (E, L): Funcin que determina si el elemento E se encuentra en L o no. Inserprim (E, L): Inserta un nodo con la informacin E como primer nodo de la lista. Inserfin (E, L): Inserta un nodo con el campo E como ltimo nodo de la lista L. Suprime (E, L): Elimina el nodo de la lista que contiene E Siguiente (P, L): Funcin que devuelve la direccin del nodo siguiente a P. Anterior (P, L): Funcin que devuelve la direccin del nodo anterior a P. Primero (L): Funcin que devuelve la direccin del primer nodo de la lista L. ltimo (L): Funcin que devuelve la direccin del ltimo nodo de la lista L. Anula (L): Esta operacin vaca la lista L. Visualiza (L): Visualiza el campo de informacin de todos los elementos de la lista.

IMPLEMENTACIN DEL TAD LISTA ENLAZADA


unit LEnlaza; interface type tInfo = ...;{tipo de campo de informacin lista} Ptr = ^Nodo; Nodo = record Info: tInfo; Sig: Ptr end; procedure Inicia ( var L: Ptr); function Esvacia (L: Ptr): boolean; function Localiza (E: tInfo; L: Ptr): Ptr; function Existe (E: tInfo; L: Ptr): boolean; function Anterior (P, L: Ptr): Ptr; function Siguiente (P, L: Ptr):Ptr; function Ultimo (L: Ptr): Ptr; procedure Inserprim (E: tInfo; var L: Ptr); procedure Inserta (E:tInfo; P:Ptr; var L:Ptr); procedure Inserfin (E: tInfo; var L: Ptr); procedure Suprime (E: tInfo; var L: Ptr); procedure Suprimedir (P: Ptr; var L: Ptr); procedure Anula (var L: Ptr); procedure Visualiza (L: Ptr);

IMPLEMENTACIN DEL TAD LISTA ENLAZADA


implementation function EsVacia; begin EsVacia:= L=nil end; function Existe; begin if not EsVacia (L) then begin while (L^.Sig<>nil) and (L^.Info<>E) do L := L^.Sig; Existe := (L^.Info = E) end; else Existe := false end;

IMPLEMENTACIN DEL TAD LISTA ENLAZADA


implementation (contina...)

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

IMPLEMENTACIN DEL TAD LISTA ENLAZADA


implementation (contina...)

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;

IMPLEMENTACIN DEL TAD LISTA ENLAZADA

IMPLEMENTACIN DEL TAD LISTA ENLAZADA


implementation (contina...) procedure Anula; begin while not EsVacia (L) do SuprimeDir (Ultimo(L), L) end; procedure Visualiza; begin while L< > nil do begin write(L^.Info, ); L := L^.Sig end end; end.

TAD LISTA ORDENADA


En las listas vistas anteriormente los elementos estn ordenados con respecto a la posicin que ocupan dentro de la lista. Si el tipo de informacin que representa cada elemento es un tipo ordinal se puede mantener la lista ordenada respecto a dicho campo. La formacin de una lista ordenada se basa en dos operaciones: Posinser (E, L): Devuelve la direccin del nodo anterior al que contiene el campo E segn la ordenacin dada y nil si es el anterior al primero. Inserorden (E, L): Si la lista est vaca el nodo se inserta como el primero de la lista, si no se inserta en la posicin que le corresponde.

IMPLEMENTACIN DE OPERACIONES LISTA ORDENADA


function Posinser (E: tInfo; L: Ptr): Ptr; var T: Ptr; begin T := nil; if not EsVacia (L) then begin while (E >= L^.Info) and (L^.Sig <> nil) do begin T := L; L := L^.Sig end; if E >= L^.Info then T := L end; Posinser := T end;
L T L^.Sig

IMPLEMENTACIN DE OPERACIONES LISTA ORDENADA


procedure Inserorden (E: tInfo; var L: Ptr); var A, N: Ptr; L begin 12 29 36 N := Crea (E); 15 N if EsVacia(L) then L := N else begin A := Posinser (E, L); if A = nil then begin{primera posicin} N^.Sig := L; L := N end; else begin {posicin intermedia} L N^.Sig := A^.Sig; A 12 29 36 A^.Sig := N A^.Sig end 15 N^.Sig N end {else} end;

IMPLEMENTACIN DE OPERACIONES LISTA ORDENADA


Ahora la operacin de bsqueda es ms eficiente, ya que para decidir si un elemento est o no en la lista, basta con encontrar un elemento mayor.
Buscorden (E, L): Devuelve la direccin del nodo que contiene el campo e o nil si no se encuentra en la lista.

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

Prof. Montserrat Serrano Montero

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

Pila Boolean Pila Pila Elemento true false error error P

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

TAD PILA IMPLEMENTADO CON LISTAS ENLAZADAS


unit PDinami; interface type tInfo = ...; {tipo de campo de informacin lista} Ptr = ^Nodo; Nodo = record Info: tInfo; Sig: Ptr end; procedure Inicia (var P: Ptr); function EsVacia (P: Ptr): boolean; procedure Apilar (var P: Ptr; E: tInfo); procedure Desapilar (var P: Ptr); procedure Cima (P: Ptr; var E: tInfo);

TAD PILA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation procedure Inicia; begin P := nil end; function EsVacia; begin EsVacia := P = nil end; procedure Apilar; var aux: ptrnodo; begin new (aux); with aux^ do P begin (1) Info := E; (2) Sig := P; 15 end; (3) P := aux 8 end;

aux P

aux

1 (1)
(2)

(3)

15 8

TAD PILA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation (contina ...) procedure Desapilar; var aux: Ptr; aux aux begin P Pila (3) if not EsVacia(P) then (1) begin 15 ???? (2) (1) aux := P; 8 8 (2) P := P^.Sig; (3) dispose(aux); end else writeln (Error: Pila vaca) end; P procedure Cima; begin 3 if not EsVacia(P) then 15 E := P^.Info else writeln (Error: Pila vaca) 8 end;

APLICACIONES DE LAS PILAS


a) Eliminar la recursividad. b) Transformar expresiones aritmticas de unas notaciones a otras: 1. Infija: es la empleada normalmente y requiere el uso de parntesis para modificar la prioridad de los operadores. 2. Prefija o polaca: es aquella en la que el operador se coloca delante de los dos operandos. En ella, no es necesario el uso de parntesis. 3. Postfija o polaca inversa: coloca el operador a continuacin de sus dos operandos. La ventaja que ofrece es que la expresin puede evaluarse de izquierda a derecha recorrindola una sola vez.

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;

B) EVALUAR EXPRESIONES ARITMTICAS


Pasos que sigue el ordenador: a) Transformar la expresin de infija a postfija. b) Evaluar la expresin postfija. Ejemplo inverso: a) Postfija a infija: Postfija: AB+CD*AB-/Infija: ((A+B)-((C*D)/(A-B))) B A (A+B) D (C*D) C (A+B) (A+B)

B) EVALUAR EXPRESIONES ARITMTICAS


B A (C*D) (A+B) (A-B) (C*D) (A+B) ((C*D)/(A-B)) (A+B)

((A+B)-((C*D) /(A-B)))

b) Se calculara el valor expresin sustituyendo los correspondientes valores, respetando el orden de operacin.

ESQUEMAS RECURSIVOS CON PILAS


uses Upila; ... procedure X (var P); var elem: tElem; begin if not EsVacia(P) then begin Cima (P, elem); Desapilar (P); Operacin (elem); X (P); Apilar (P, elem); end end;

Desapilar (P, elem);

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;

EJ. ESQUEMA RECURSIVO


Implementar un algoritmo en Pascal que cuente el nmero de elementos de una pila de forma recursiva sin utilizar ninguna estructura de datos auxiliar. a) Escribir la seccin interface de la unidad Pila. b) function Contar (var P: Ptr): integer; var long, elem: integer; begin if not EsVacia (P) then begin Desapilar (P, elem); long := Contar (P) + 1; Apilar (P, elem); Contar := long; end else Contar := 0 end;

Universidad de Valladolid
Departamento de informtica
Campus de Segovia

Estructura de datos
Tema 3:TAD cola

Prof. Montserrat Serrano Montero

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)

Cola Boolean Cola Cola Cola

*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.

TAD COLA IMPLEMENTADO CON ARRAY CIRCULAR


implementation function Siguiente (P: integer): integer; begin Siguiente := (P mod long) + 1 end; procedure Inicia; begin C.frente := 1; C.final := long; end; function EsVacia; begin EsVacia := Siguiente (C.final) = C.frente end; function EsLlena(C: Cola): boolean; begin EsLlena := Siguiente(Siguiente(C.final)) = C.frente end;

TAD COLA IMPLEMENTADO CON ARRAY CIRCULAR


implementation (contina...) function Primero; begin if not EsVacia (C) then Primero := C.Elementos[C.frente] end; procedure Encolar; begin if not EsLlena (C) then with C do begin final := Siguiente (final); Elementos [final] := E end end; procedure Desencolar; begin if not EsVacia (C) then C.frente := C.frente + 1 end;

IMPLEMENTACIN DEL TAD COLA CON LISTAS ENLAZADAS


unit CDinamic; interface type tInfo = ...; {tipo de campo de informacin lista} Ptr = ^Nodoc; Nodoc = record Frente Final Info: tInfo; Sig: Ptr end; Cola = record frente, final: Ptr end; procedure Inicia (var C: Cola); function EsVacia (C: Cola): boolean; procedure Primero (C: Cola; var E: tInfo); procedure Desencolar (var C: Cola); procedure Encolar (var C: Cola; E: tInfo);

TAD COLA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation procedure Inicia; begin C.frente := nil; C.final := nil end; function EsVacia; begin EsVacia := C.frente = nil end; procedure Primero; begin if not EsVacia (C) then E := C.frente^.Info end;

TAD COLA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation (contina...) procedure Desencolar; var A: ptr; begin if not EsVacia (C) then with C do begin A:= frente; frente := frente^.Sig; if frente = nil then final := nil; dispose (A); end end;

TAD COLA IMPLEMENTADO CON LISTAS ENLAZADAS


implementation (contina...) function Crea (E: tInfo): Ptr; var A: ptr; begin new (A); A^.Info:= E; A^.Sig := nil; Crea := A end; procedure Encolar; var N: ptr; begin N := Crea (E) with C do begin if EsVacia (C) then frente := N else final^.Sig := N; final := N; end end; end.

ESQUEMAS RECURSIVOS CON COLAS

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;

ESQUEMAS RECURSIVOS CON COLAS


Ejemplo: Dado el TAD Cola de enteros se pide implementar una operacin que invierta el contenido de una Cola. a) Escribir la seccin interface de la unidad cola. b) procedure Invertir (var C: Cola); var elem: integer; begin if not EsVacia (C) then begin Desencolar (C, elem); Invertir (C); Encolar (C, elem) end end;

You might also like