23
ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales. 1 TEMA 3: TIPOS ABSTRACTOS DE DATOS. TIPOS LINEALES ÍNDICE. 3.1 Tipos Abstractos de Datos (TAD´s) Especificación e Implementación Programación con TADs Ejemplo: Números complejos 3.2 Definición y especificación de tipos lineales Pilas Colas Listas con punto de interés 3.3 Implementaciones de los tipos lineales Asignación dinámica de memoria. Punteros Implementaciones del tipo Pila Implementaciones del tipo Cola Implementaciones del tipo Lista con punto de interés ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales. 2 OBJETIVOS. Reforzar a través de la definición de abstracción de datos las diferencias entre especificación (TAD) e implementación de una abstracción. Estudiar los tipos (abstractos) de datos lineales: listas, pilas y colas. Analizar sus distintas implementaciones (representación de los datos y diseño de los algoritmos de manejo). Estudiar los mecanismos de asignación dinámica de memoria y el tipo puntero. Estudiar algunas aplicaciones concretas de estas estructuras de datos. BIBLIOGRAFÍA. Aho, Hopcroft, Ullman. “Estructuras de Datos y Algoritmos.” Addison Wesley Iberoamericana, 1988 (edición en inglés de 1983). Capítulo1, capítulo 2 (apartados 1, 2, 3 y 4). Franch X. “Estructura de Dades. Especificació, disseny i implementació”. Edicions UPC, 1993. Capítulos 3 y 7.

DATOS. TIPOS LINEALES TEMA 3: TIPOS ABSTRACTOS DEusers.dsic.upv.es/~erodri/tema3.pdf · 3.2 Definición y especificación de tipos lineales Pilas Colas ... de datos lineales: listas,

Embed Size (px)

Citation preview

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

1

TEMA 3: TIPOS ABSTRACTOS DEDATOS. TIPOS LINEALES

ÍNDICE.

3.1 Tipos Abstractos de Datos (TAD´s)� Especificación e Implementación

� Programación con TADs

� Ejemplo: Números complejos

3.2 Definición y especificación de tipos lineales� Pilas

� Colas

� Listas con punto de interés

3.3 Implementaciones de los tipos lineales� Asignación dinámica de memoria. Punteros

� Implementaciones del tipo Pila

� Implementaciones del tipo Cola

� Implementaciones del tipo Lista con punto de interés

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

2

OBJETIVOS.

� Reforzar a través de la definición de abstracción de datos lasdiferencias entre especificación (TAD) e implementación de unaabstracción.

� Estudiar los tipos (abstractos) de datos lineales: listas, pilas ycolas. Analizar sus distintas implementaciones (representación delos datos y diseño de los algoritmos de manejo).

� Estudiar los mecanismos de asignación dinámica de memoria y eltipo puntero.

� Estudiar algunas aplicaciones concretas de estas estructuras dedatos.

BIBLIOGRAFÍA .

� Aho, Hopcroft, Ullman. “Estructuras de Datos y Algoritmos.”Addison Wesley Iberoamericana, 1988 (edición en inglés de 1983).Capítulo1, capítulo 2 (apartados 1, 2, 3 y 4).

� Franch X. “Estructura de Dades. Especificació, disseny iimplementació”. Edicions UPC, 1993. Capítulos 3 y 7.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

3

3.1 TIPOS ABSTRACTOS DE DATOS (TADS).

��Un grupo de operaciones que actúan sobre un mismo tipo dedatos (conjunto de valores)��Con la restricción de que el comportamiento de estas operacionesdefine al tipo.

“Lo interesante de un tipo de datos NO es tanto los valores que lo constituyeny MUCHO MENOS su representación concreta, como la clase de

manipulaciones a las que se le puede someter o las propiedades quesatisface” (F. Orejas).

Ejemplos de abstracción de datos:

1.- Tipos elementales de un lenguaje de programación. La definición de laabstracción de datos entero sería:

entero

+

-

*

IMP

LEM

EN

TA

CIO

N

2.- Los tipos definidos por el usuario no tienen operadores predefinidos. Sedeben definir como (sub)algoritmos. Definición de la abstracción de datosconjunto:

conjunto

U

-

IMP

LEM

EN

TA

CIO

N

U

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

4

ESPECIFICACIÓN E IMPLEMENTACIÓN DE TADS

Como ocurre con toda abstracción, tanto de operaciones como dedatos, debemos distinguir dos niveles en su DISEÑO:

1.- Especificación o definición ¿qué es? o ¿qué hace? laabstracción. Esta definición puede ser formal o informal.

Ejemplo: Especificación de una abstracción de operacionesmediante su pre/postcondición expresadas mediante el lenguajelógico de primer orden.

2.- Implementación o ¿Cómo es? o ¿Cómo lo hace? en undeterminado entorno informático.

Ejemplo: Implementación de una abstracción de operacionesmediante las “function” y “procedure” de los lenguajes deprogramación.

La ESPECIFICACIÓN DE UN TIPO DE DATOS debe incluir:

� Nombre del tipo [parámetro1, ... , parámetron]

� Lista de operaciones sobre el tipo: sintaxis o perfil de lasoperaciones. Se dará como cabecera de procedimiento o función

� Semántica de las operaciones sobre el tipo: precondición ypostcondición

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

5

PROGRAMACIÓN CON TADS

VENTAJAS:

� Independencia de la implementación del tipo.� Programas más portables, legibles, reutilizables.� Mayor seguridad de la información, menos efectos

colaterales.� Mayor facilidad para comprobar la corrección.

TADs y Lenguajes de Programación:

� Los lenguajes de programación posteriores al 1975 soportanel concepto de TAD (Ej. ADA, Modula-2, C++)

� Si el lenguaje no permite el diseño basado en TADs seránecesario suplir esta insuficiencia con una disciplina en suuso: usar sólo las posibilidades del mismo que no violen losprincipios de ocultamiento establecidos en el diseño (Ej.PASCAL, C, FORTRAN, COBOL)

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

6

EJEMPLO : NÚMEROS COMPLEJOS

Para poder resolver problemas en los que se utilizan númeroscomplejos se define el tad número complejo mediante:

- una representación posible (forma cartesiana)- operaciones de transformación de tipos:

- creaC, crea un complejo a partir de dos reales- prealC, obtiene la parte real de un complejo- pimgC, obtiene la parte imaginaria de un complejo

- operaciones aritméticas entre complejos:- sumaC, restaC, multC, divsnC y módC

Especificación del Tad Número complejo

TIPO complejo

SINTAXISfunción creaC(pr,pi:real):complejo;función prealC(c:complejo):real;función pimagC(c:complejo):real;función sumaC(c1,c2:complejo):complejo;función restaC(c1,c2:complejo):complejo;función multC(c1,c2:complejo):complejo;función divsnC(c1,c2:complejo):complejo;función módC(c:complejo):real;

SEMÁNTICA

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

7

{ pr=PR � pi=PI }c:=creaC(pr,pi)

{ c=(PR + PIi) }

{ c = (A + Bi) }r :=prealC(c)

{ r = A }

{ c = (A + Bi) }r :=pimagC(c)

{ r = B }

{ c1 = (A + Bi) � c2 = (C + Di) }c3:=sumaC(c1,c2)

{ c3 =(A+C) + (B+D)i }

{ c1 = (A + Bi) � c2 = (C + Di) }c3:=restaC(c1,c2)

{ c3 =(A-C) + (B-D)i }

{ c1 = (A + Bi) � c2 = (C + Di) }c3:=multC(c1,c2)

{ c3 =(AC-BD) + (AD+BC)i }

{ c1 = (A + Bi) � c2 = (C + Di) � c2 � (0 + 0i) }c3:=divsnC(c1,c2)

{ c3 =[(AC+BD)/(C²+D²)] + [(BC-AD) /(C²+D²)] i }

{ c = (A + Bi) }r :=módC(c)

{ r = raíz(A²+B²) � 0�r }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

8

Implementación del Tad Número complejo

Como se sigue la representación cartesiana de los númeroscomplejos, se representarán mediante una tupla con doscomponentes:

Tipo: complejo = tupla preal: real; pimag: real;

ftupla

Operaciones:{ pr=PR � pi=PI }función creaC(pr,pi:real): complejo;

var c:complejo fvarc.preal:=pr; c.pimag:=pi;devuelve(c)

ffunción{ creaC(pr,pi)=(PR + PIi) }

{ c = (A + Bi) }función prealC(c:complejo):real;

devuelve(c.preal)ffunción{ prealC(c)= A }

{ c = (A + Bi) }función pimagC(c:complejo):real;

devuelve(c.pimag)ffunción{ pimagC(c) = B }

{ c1 = (A + Bi) � c2 = (C + Di) }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

9

función sumaC(c1,c2:complejo):complejo;var c3:complejo fvar

c3.preal:=c1.preal + c2.preal;c3.pimag:=c1.pimag + c2.pimag;devuelve(c)

ffunción{ sumaC(c1,c2) =(A+C) + (B+D)i }

{ c1 = (A + Bi) � c2 = (C + Di) }función restaC(c1,c2:complejo):complejo;var c3:complejo fvar

c3.preal:=c1.preal - c2.preal;c3.pimag:=c1.pimag - c2.pimag;devuelve(c)

ffunción{ restaC(c1,c2) =(A+C) - (B+D)i }

{ c1 = (A + Bi) � c2 = (C + Di) }función multC(c1,c2:complejo):complejo;var c3:complejo fvar

c3.preal:=c1.preal*c2.preal - c1.pimag*c2.pimag;c3.pimag:=c1.preal*c2.pimag + c2.preal*c1.pimag;devuelve(c)

ffunción{ multC(c1,c2) =(AC-BD) + (AD+BC)i }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

10

{ c1 = (A + Bi) � c2 = (C + Di) � c2 � (0 + 0i) }función divsnC(c1,c2:complejo):complejo;var c3:complejo; aux:real fvar

aux:=c2.preal*c2.preal + c2.pimag*c2.pimag;c3.preal:=(c1.preal*c2.preal + c1.pimag*c2.pimag)/aux;c3.pimag:=(c2.preal*c1.pimag - c1.preal*c2.pimag)/aux;devuelve(c3)

ffunción{divsnC(c1,c2)=[(AC+BD)/(C²+D²)]+[(BC-AD) /(C²+D²)]i}

{ c = (A + Bi) }función módC(c:complejo):real;

devuelve(raíz(c.preal*c.preal+c.pimag*c.pimag)){ módC(c) = raíz(A²+B²) � 0�r }

Una vez definido el tad número complejo, se tiene:

- Es posible utilizar el tipo complejo para efectuar nuevasdefiniciones, de forma similar a como se haría con losrestantes tipos numéricos.

- Las únicas operaciones permitidas sobre datos de tipocomplejo son las definidas en el tad del mismo.

- Los algoritmos que utilicen el tad complejo no dependende la representación interna de dicho tipo, ni de laimplementación que se haya efectuado de las operaciones.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

11

Ejemplo: utilización del tad complejo

En teoría de circuitos es habitual utilizar matrices de númeroscomplejos para representar circuitos eléctricos en los queaparecen elementos inductivos o capacitivos.

En el estudio de dichos circuitos se utilizan operacionesalgebraicas como el producto matricial, entre otras, así:

dadas A,B�Cnxn ;se desea calcular M�Cnxn, tal que M=A*B

TipoMatrizC : Vector[1..N,1..N] de complejo;

{a=A � b=B }procedimiento prodMC( a,b: MatrizC; var m: MatrizC);var i,j,k: entero fvar

Para i:=1 hasta N hacerPara j:=1 hasta N hacer

m[i,j]:=creaC(0,0); /* se asigna el neutro*/Para k:=1 hasta N hacer

m[i,j]:=sumaC(m[i,j], multC(a[i,k],b[k,j]));fpara

fparafpara

fprocedimiento{ m= A*B }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

12

3.2 DEFINICIÓN Y ESPECIFICACIÓN DE TIPOS LINEALES

PILAS

Una abstracción de datos Pila es una estructura LIFO (del inglésLast-In First-Out, o "el último que entra es el primero que sale"):

��

Los elementos se insertan de uno en uno y se recuperan también deuno en uno, en orden inverso a como se han introducido.

Se caracteriza por las siguientes operaciones:

creap(p): crea una pila vacíaapilar(p,v): añade el elemento v en la pila pdesapilar(p): saca un elemento de la pilatopep(p): consultar el tope de la pilavaciap?(p): decidir si la pila está vacia

Ejemplos: utilización de pilas en el diseño de algoritmos

� Gestión de las direcciones de retorno que hace el sistema en lasllamadas a procedimientos en un programa.

� Evaluación de expresiones.� Transformación de algunas clases de funciones recursivas eniterativas.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

13

Especificación de PILA o TAD PILA

TIPO pila [elemento]SINTAXISprocedimiento creap(sal p:pila);procedimiento apilar(ent/sal p:pila; v:elemento);procedimiento desapilar(ent/sal p:pila);función topep(p:pila) devuelve elemento;función vaciap?(p:pila) devuelve lógico;

SEMÁNTICA

{}creap(p){p=}

{p=P1 P2.. Pn � v=V }apilar(p,v){p=P1 P2.. Pn V}

{p=P1 P2.. Pn ��p<>}desapilar(p){p=P1 P2.. Pn-1}

{p=P1 P2.. Pn ��p<>}e:=topep(p){ p=P1 P2.. Pn ��e= Pn}

{ p=P1 P2.. Pn }b:=vaciap?(p){ p=P1 P2.. Pn ��b=(p=)}

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

14

COLAS

Una Cola es una estructura FIFO (First-In First-Out o “el primeroque entra es el primero que sale”).

Las inserciones se realizan por un extremo y las extracciones por elotro; el elemento que se puede consultar en todo momento es el queprimero se insertó.

Se caracteriza por las siguientes operaciones:

creaq: crea una cola vacíaencolar(q,e): inserta un elemento en la coladesencolar(q): elimina el primer elemento de la colaprimero(q): obtiene el primer elemento de la colavaciaq?(q): devuelve CIERTO si la cola está vacía y FALSO encaso contrario

Ejemplo de aplicación:La asignación de CPU a procesos de usuarios que realiza el sistemaoperativo con una política round-robin sin prioridades:los procesosque solicitan el procesador se encolan de forma que cuando acabael que se está ejecutándose actualmente pasa a ejecutarse el quelleva mas tiempo esperando.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

15

Especificación de COLA o TAD COLA

TIPO cola [elemento]

SINTAXISprocedimiento creaq (e/s q:cola);procedimiento encolar (e/s q:cola; e:elmento);procedimiento desencolar (e/s q:cola);función primero (q:cola) devuelve elemento;función vaciaq? (q:cola) devuelve lógico;

SEMÁNTICA{}creaq(q){q=}

{q=Q1 Q2 .. Qn � e=E}encolar(q,e){q=Q1 Q2 .. Qn E}

{q=Q1 Q2 .. Qn ��q<>}desencolar(q){q=Q2 .. Qn }

{q=Q1 Q2 .. Qn ��q<>}e:=primero (q){ q=Q1 Q2 .. Qn ��e = Q1 }

{ q=Q1 Q2 .. Qn }b:=vaciaq?(q){ q=Q1 Q2 .. Qn ��b=(q=�}

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

16

3.2.3 LISTAS CON PUNTO DE INTERÉS

Una lista es una secuencia de elementos de un tipo dado, ordenadoslinealmente según la posición que ocupan en la misma.

Una lista con punto de interés es una lista que tiene una posiciónespecial, o distinguida, sobre la que se aplican las distintasoperaciones.

La posición distinguida, o punto de interés, se puede cambiar, con loque es posible operar sobre los distintos elementos de la lista.

La lista con punto de interés se caracteriza por tres tipos deoperaciones:

Operaciones para manipular el contenido:

creal(l): crea una nueva lista vacía.inserta(l,e): inserta el elemento e en la lista l en la posicióninmediatamente anterior a la distinguida.suprime(l): elimina el elemento que está en la posición distinguidade la lista l.recupera(l): devuelve el elemento que está en la posicióndistinguida de la lista l.

Operaciones para cambiar el punto de interés:

principio(l): sitúa el punto de interés de la lista l al principiofin(l): sitúa el punto de interés de la lista l al finalsiguiente(l): cambia el punto de interés de la lista l de la posiciónque ocupa a la siguiente.

Operaciones para consultar el estado de la lista:

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

17

esvacial(l): devuelve CIERTO si la lista l está vacía y FALSO encaso contrario.esfin(l): devuelve CIERTO si el punto de interés de la lista l esposterior al último elemento y FALSO en caso contrario.

Especificación del Tad Lista con punto deinterés

TIPO lista[elemento]

SINTAXIS

procedimiento creal (sal l:lista);procedimiento inserta (ent/sal l:lista; e:elemento);procedimiento suprime (ent/sal l:lista);función recupera (l:lista) devuelve elemento;procedimiento principio (ent/sal l:lista);procedimiento fin (ent/sal l:lista);procedimiento siguiente (l:lista);función esvacial (l:lista) devuelve lógico;función esfinl (l:lista) devuelve lógico;

SEMÁNTICANotación utilizada:- l = L1L2..Ln ��0�n, donde n=0 equivale a l=,- pos, 1�pos�n+1,es la posición del punto de interés.

{}creal(l)

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

18

{l =�� pos=1}

{l =L 1L2..Ln � pos=i � 1�pos�n+1�� e=E }inserta(l,e){l=L’ 1L’ 2...L

’n+1�(L’ 1=L1...L’ i-1=Li-1)�L’ i=E�(L’ i+1=Li...L’n+1=Ln)�pos=i+1}

{l =L 1L2...Ln � pos=i � 1�pos�n }suprime(l){l=L’ 1 L’ 2...L

’n-1 �(L’ 1=L1...L’ i-1= Li-1)�(L’ i=Li+1...L’n-1= Ln)� pos=i }

{l = L 1L2...Ln � 1�pos�n }e:=recupera(l){l = L 1L2...Ln � e=Lpos}

{l=L 1 L2...Ln � 0�n}principio(l){l=L 1L2...Ln � pos=1}

{l=L 1L2...Ln � 0�n}fin(l){l=L 1L2...Ln � pos=n+1}

{l=L 1L2...Ln ��1�pos�n � pos=i}siguiente(l){ l=L 1L2...Ln ��pos=i+1}

{l=L 1L2...Ln � 0�n}b:=esvacial(l){b=(n=0)}

{l=L 1L2...Ln � 0�n}b:=esfin(l){b=(pos=n+1)}

Ejemplos de utilización del TAD lista conpunto de interés

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

19

1.- Tratamiento de todos los elementos de una lista l:

{ l=L 1L2...Ln � 0�n }procedimiento recorrer(ent l:lista)

var e:elemento fvar;

primero(l);

mientras no esfin(l) hacer

e:=recupera(l); tratar(e);

siguiente(l);

fmientras;

fprocedimiento{ l=L 1L2...Ln � �i:1�i�n:tratar(Li) }

Ejercicios propuestos:

-Dada la lista l, crear la lista l’ con el mismo contenido que l

-Dada la lista l, borrar todos sus elementos

-Dadas las listas l y l’, obtener l’’ concatenación de l y l’

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

20

2.-¿Existe en l un elemento que cumple la propiedad P?

{ l=L 1L2...Ln � 0�n }función búsqueda(l:lista): lógico

var enc: lógico; e:elemento fvar

enc:=falso; primero(l);

mientras (no esfinl(l)) y (no enc) hacer

e:=recupera(l);

si P(e) entonces enc:=cierto

sino siguiente(l) fsi

fmientras;

devuelve(enc)

ffunción

{ búsqueda(l) l=L1L2...Ln � �i:1�i�n:P(Li) }

Ejercicios propuestos:

-Obtener la posición del primer elemento de l que cumple P

-Obtener la posición del último elemento de l que cumple P

-¿Todos los elementos de l, cumplen la propiedad P?

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

21

3.3 IMPLEMENTACIÓN DE TIPOS LINEALES .

1.- Representación vectorial: Los elementos de la estructurase almacenan en un vector de forma que elementosconsecutivos en la pila ocupan posiciones consecutivas en elvector (array ).

2.- Representación enlazada: Se rompe la propiedad derepresentación secuencial y se introduce el concepto deenlace: todo elemento de la estructura identificaexplícitamente la posición que ocupa su sucesor en la misma.La estructura se puede almacenar en un vector o gestionarladinámicamente utilizando punteros.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

22

ASIGNACIÓN DINÁMICA DE MEMORIA . PUNTEROS

EL TIPO PUNTERO EN PASCAL

Se caracteriza por su bajo nivel de abstracción debido a queesta muy próximo a la organización de la información en lamemoria central de un ordenador.

Es un tipo de datos elemental cuyo dominio está compuesto pordirecciones de memoria con tipo. El tipo de estas variables sellama Tipo Puntero a un tipo de datos dado T.

No existe un tipo puntero único como ocurre en los otros tiposde datos básicos, sino tipos punteros a tipos de datos.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

23

Definición de una variable de tipo puntero-a:VAR nombre_de_variable : �T;

var ......

I : T ;PtoI : �T;

p p+1 p+2 p+n-1

La variable I es de tipo T y la variable PtoI es de tipo puntero aun valor de tipo T que ocupa n posiciones de memoria a partirde la posición p.

Ejemplo: Var I : integer;PtoI, ptoJ : ˆ integer;

VALOR NULO DE LOS TIPOS PUNTERO-A (polimorfismo)

Para todos los conjuntos de valores de los tipos puntero-a, existeun valor que representa la dirección de memoria nula: NIL.

Ejemplo: Var p1: ̂ T1;p2: ̂ T2; /*Donde T1 � T2*/

p1 := Nil;p2 := Nil;

Los tipos de p1 y p2 son puntero a T1 y puntero a T2. Son dostipos diferentes a los que se le asigna un valor nulo diferente paracada tipo pero con la misma representación (NIL).

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

24

VARIABLES DINÁMICAS

En el lenguaje Pascal existen dos clases de variables según elmomento en el que se asigna memoria para poder guardar unvalor:- Una variable es estática si la asignación de memoria se

realiza durante el análisis estático (compilación)- Una variable es dinámica si la asignación de memoria se

realiza durante la ejecución del programa.

Para la asignación de memoria a una variable dinámica elprograma en ejecución dispone de dos zonas de memoria:

� La Pila: se utiliza para asignar memoria a los parámetros ylas variables locales de funciones y procedimientos.

� El Heap: se utiliza para asignar memoria al resto devariables dinámicas.

ASIGNACIÓN Y LIBERACIÓN DE MEMORIA

Las variables dinámicas sólo utilizan memoria durante laejecución de un programa, por lo que se hace necesario unmecanismo que permita el proceso de asignación y liberaciónde memoria.

Para la pila de ejecución este proceso es automático en ellenguaje Pascal.

Para la gestión del Heap, Pascal proporciona una primitivas quepermiten que el proceso de asignación y liberación de memorialo determine el propio programador.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

25

Primitivas para la obtención y liberación de memoria:

A la obtención de memoria para una variable dinámica sedenomina CREACIÓN DE UNA VARIABLE DINÁMICA:

Primitiva: NEW(pto)Var pto : ˆ T;

new(pto);

new(pto) reserva la memoria suficiente en el heap para guardarla representación binaria de un valor de tipo T. En la variablepto se almacena la dirección a la celda de memoria a partir dela cual se puede almacenar un valor de tipo T.

pto

Heap

.....

p p+1 p+2 p+n-1

- La variable pto contiene la dirección p- Son necesarias n celdas para guardar la representación binaria de un valor de tipo T.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

26

A la liberación de la memoria utilizada por una variabledinámica se denomina BORRADO DE UNA VARIABLEDINÁMICA.

Primitiva: DISPOSE(pto)pto

Heap

.....

p p+1 p+2 p+n-1

El procedimiento dispose libera el uso de la memoria del heaputilizada para guardar un valor de tipo T.

dispose(pto)pto

Heap ¿?

.....

p

La memoria liberada por dispose queda disponible para nuevasdemandas de memoria.La variable puntero que apunta a una variable dinámica que hasido borrada pasa a contener un valor indefinido.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

27

ACCESO A LOS VALORES DE UN VARIABLE DINÁMICA

A una variable dinámica se accede a través de la dirección apartir de la cual esta guardado su valor, es decir, utilizando unpuntero que la apunta. El operador de acceso a una variabledinámica es: �

Var pto : �T;

beginnew(pto);pto�:= <valor>;

Donde <valor> es un dato de tipo T.

Ejemplo:Program ejemplo (input,output);

Var p: �integer;I:integer;

beginI:=5;New(p);p�:=I;writeln(p �);p�:= p �+1;writeln(p �);

end.

Este programa produce los valores 5 y 6 en su salida estándar.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

28

EJEMPLOS DE USO

Var

pto1, pto2, pto3: �integer;

begin

new(pto1);new(pto2);{ pto1 � pto2 }

pto1�:= 1;pto2�:= 2;{pto1� = 1 � pto2� = 2 � pto1 � pto2 }

pto3 := pto1;{pto1�=1�pto2�=2�pto3�=1�pto1�pto2�pto1�pto3 � pto2� pto3}

pto1�:= pto2�;{pto1�=2�pto2�=2�pto3�=2�pto1�pto2�pto1�pto3 � pto2� pto3}

dispose(pto3);{pto2�=2�pto1=indefinido� pto3=indefinido}

end.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

29

IMPLEMENTACIÓN DE UNA PILA .

Representación vectorial

P1 P2 ... Pn �

tope

� Apilar un elemento:P1 P2 ... Pn V

� tope

� Desapilar un elemento:P1 P2 ... Pn-1 Pn

� tope

tipo pila = tupladatos: vector [1..MaxP] de elemento;tope: Natural;

ftupla

� Si p es de tipo pila, la información está en p.datos[1..p.tope]

{}procedimiento creap (sal p:pila)

p.tope := 0

fprocedimiento{p=}

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

30

{p = P1 P2.. Pn � v = V }procedimiento apilar (ent/sal p: Pila; v: elemento)

si p.tope<MaxP entonces

p.tope := p.tope + 1; p.datos[p.tope]:=v

sino error(‘La pila está llena’)

fprocedimiento{p = P1 P2.. Pn V}

{p = P1 P2.. Pn��p <> }procedimiento desapilar (ent/sal p: Pila)

p.tope := p.tope - 1

fprocedimiento{p = P1 P2.. Pn-1}

{p = P1 P2.. Pn ��p <> }función topep (p: Pila) devuelve elemento

devuelve p.datos[p.tope]

ffunción{ p = P1 P2.. Pn ��topep(p) = Pn}

{ p = P1 P2.. Pn }función vaciap? (p:Pila) devuelve Lógico

devuelve (p.tope = 0)

ffunción{ p = P1 P2.. Pn ��vaciap?(p) = (p = )}

� El coste temporal de las operaciones es óptimo, �(1)� El coste espacial es �(MaxP) independientemente del número deelementos que la formen.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

31

Representación enlazada usando variabledinámica

tipo pila = �Nodo

Nodo = tupladato: elemento;sig: pila;

ftupla;

{}procedimiento creap (sal p: pila)

p := nil

fprocedimiento{p=}

{p = P1 P2.. Pn � v = V }procedimiento apilar (ent/sal p: pila;v: elemento)

var nuevo: pila fvar;

new(nuevo); nuevo^.dato := v; nuevo^.sig := p; p := nuevo;

fprocedimiento{p = P1 P2.. Pn V}

{p = P1 P2.. Pn��p <> }procedimiento desapilar (ent/sal p:pila)

var borra:pila;

borra := p; p := p^.sig; dispose(borra);

fprocedimiento{p = P1 P2.. Pn-1}

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

32

{p = P1 P2.. Pn ��p <> }función topep (p:pila) devuelve elemento

devuelve p^.dato;

ffunción{ p = P1 P2.. Pn ��topep(p) = Pn}

{ p = P1 P2.. Pn }función vaciap? (p:pila) devuelve Lógico

devuelve (p=nil)

ffunción{ p = P1 P2.. Pn ��vaciap?(p) = (p = )}

Estudio comparativo de las implementaciones

• La complejidad temporal de todas las operaciones en ambasrepresentaciones es independiente de la talla del problema.

• En cuanto a complejidad espacial, la implementaciónvectorial presenta el inconveniente de la estimación del tamañomáximo y la reserva de espacio que en muchos casos no seutilizará. La representación enlazada requiere un espacio dememoria adicional para los enlaces.

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

33

IMPLEMENTACIÓN DE COLAS

Representación vectorial

Los elementos de la cola se distribuyen secuencialmente en unvector; además necesitamos para su representación:

1.- un marcador (“libre”) de la posición donde insertar el siguienteelemento (marcador al primer elemento libre de la cola).

a b c � � libre MaxC

¿qué pasa si desencolamos?

Si el 1er elemento de una cola fuera siempre el que ocupa la 1ªposición del vector, cada operación de borrado, “desencolar”,supondría el desplazamiento del resto de elementos de la cola unaposición hacia la izquierda;

a b c � � libre MaxC

desencolar(q)

b c � � libre MaxC

desplazar(q);

b c� �libre MaxC

¡extremadamente ineficiente!

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

34

2.- Necesitamos también un marcador de primer elemento de lacola, que llamaremos “prim”

a b c � � � prim libre MaxC

Como consecuencia de tener sólo los marcadores “libre” y “prim”para manejar el vector-cola, es posible que cualquiera de estos dosmarcadores (o ambos) llegen al final del vector (MaxC)

¡SIN QUE LA COLA ESTÉ TOTALMENTE LLENA!

Para poder reutilizar todas las posiciones del vector sin tener quedesplazar elementos, y así llegar a su final con todas sus posicionesocupadas:

Consideraremos el vector como una estructura circular , sinprincipio ni fin, donde después del último elemento va el primero

.....

....

MaxC

1

2

prim

libre

COLA c

COLA_VACIA: prim= libreCOLA_LLENA: prim = libre

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

35

3. Aún con la estructura circular propuesta NO hay suficienteinformación para decidir si una cola está vacía o no, ya que lacondición de cola vacía es la misma que la de cola llena. Por tanto,además de la estructura circular con dos marcadores, el vector-colanecesita de un tercer marcador: el indicador de cola vacía o llena.Hemos implementado este indicador como un contador deelementos de la cola.

Representación vectorial circulartipo

cola = tupladatos = vector [1..MaxC] of elemento;prim, libre: Nat;long: Nat;

ftupla

Si q es de tipo cola, la información está en

q.datos[q.prim..q.libre-1]

.....

....

MaxC

1

2

c.prim

c.libre

COLA c

COLA_VACIA: (c.prim = c.libre) � (c.long = 0)COLA_LLENA: (c.prim = c.libre) � (c.long �MaxC)

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

36

{}procedimiento creaq (e/s q:cola)

q.pri:= 1; q.libre:= 1; q.long:=0;

fprocedimiento{q = }

{ q=Q1 Q2 .. Qn � e=E }procedimiento encolar (e/s q:cola; e:elemento)

si q.long<MaxC entonces

q.elementos[q.libre]:=e;

q.libre:=siguiente(q.libre);

q.long:=q.long+1

sino error (‘Cola llena’)

fprocedimiento{q=Q1 Q2 .. Qn E}}

{q=Q1 Q2 .. Qn � q � }procedimiento desencolar (e/s q:cola)

q.pri:=siguiente(q.pri);

q.long:=q.long-1;

fprocedimiento{q=Q2 .. Qn }

{q=Q1 Q2 .. Qn � q � }función primero (q:cola) devuelve elemento

devuelve q.datos[q.pri]

fprocedimiento{ q=Q1 Q2 .. Qn � primero(q) = Q1}

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

37

{ q=Q1 Q2 .. Qn }función vaciaq? (q:cola) devuelve lógico;

devuelve (q.long=0)

ffunción{ q=Q1 Q2 .. Qn � b=(q=�}

Función privada de la implementación de la cola

{1 ��i ��MaxC}función siguiente (i:Nat) devuelve Nat

devuelve (i mod MaxC) + 1

ffunción{(1 ��i ��MaxC ��siguiente(i) = i+1)

�i = MaxC ��siguiente(i) = 1)}

� El coste temporal de las operaciones es �(1) .

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

38

Representación enlazada usando variable dinámica.Ejercicio.

Implementar el TAD COLA utilizando una representaciónenlazada con variables dinámicas.

tipoenlace= �nodo;

cola= tupla prim,ult:enlace; long:nat;ftupla

nodo= tupla dato:elemento; sig:enlace;ftupla

Nota: En este caso el marcador señala al último elemento de lacola y NO al primer elemento libre (como en laimplementación con vector circular).

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

39

IMPLEMENTACIÓN DE LISTAS CON PUNTO DEINTERÉS

Representación secuencial: Vector en el que los elementosde la lista se almacenan en posiciones contiguas

const MaxL = --;tipo

posición= Natural;

lista= tupla datos: vector [1..MaxL] de elemento; ult, pos: posición;ftupla

datos L1 L2 L3 ... Ln ......1 2 3 � MaxL

ult

No se utiliza apenas, por ser una representación ineficiente,puesto que:

- la operación de inserción supone el desplazamiento (unaposición a la derecha) de todos los elementos posteriores

- la operación de borrado supone el desplazamiento (unaposición a la izquierda) de todos los elementos posteriores

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

40

Representación enlazada

� Para evitar los desplazamientos de los valores se utiliza unarepresentación enlazada, en la que los elementos no estánalmacenados en el mismo orden que ocupan en la lista.

� Esta representación enlazada requiere guardar junto con cadaelemento la dirección del siguiente elemento de la lista.

� La disposición de los elementos en el vector es irrelevante ydepende sólo de la historia de la estructura y de laimplementación de los algoritmos

Dos posibles implementaciones: Vectores o Variables dinámicas

(a) Utilizando vectoresPara definir listas enlazadas se utiliza un vector de nodos con lainformación del nodo más la posición que ocupa dentro delvector su elemento sucesor.

const Máximo= ---;tipo

posición=Natural ;Nodo= tupla

e:elemento; pos: posición; ftupla

MEMORIA= vector [1.. Máximo] de NODO;

Lista=tupla pri, ult, pos:posición

ftupla;

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

41

Convención: el último elemento tendrá el 0 como indicador desu sucesor

Obsérvese cómo en esta estructura se puede representar más deuna lista, e incluso otras estructuras.

Ejemplo: lista de enteros = 20,23,25,30,35

1 30 42 20 5 pri3 25 14 35 0 ult5 23 3...

... ...

Máximo

Ejercicio: Implementar las operaciones del tipo Lista con punto deinterés utilizando una representación vectorial enlazada. Para ello,supóngase que se dispone de dos funciones predefinidas,

obten_posnodo(var m:memoria) devuelve posición

libera_nodo(p:posición; var m: memoria)

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

42

(b) Utilizando variables dinámicas

� Una lista queda representada por una secuencia de nodosenlazados y tres punteros: pri, ult y ant.

� Para mejorar las operaciones de borrado e inserción y facilitar eltratamiento de la lista vacía, el primer nodo de la lista es‘ficticio’, y tiene posición 0.

� pri, puntero al primer nodo existente,� ult, puntero al último nodo� ant, puntero al nodo anterior a la posición distinguida

tipoptr = �Nodo;

Nodo= tupladato:elemento;sig:ptr ;

ftupla

Lista= tuplapri, ult, ant: ptr ;

ftupla

pri ult

L1 L2 L3

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

43

{}procedimiento creal (e/s l:lista)var aux:ptr fvar

new(aux); aux�.sig:=NIL;l.pri:= aux; l.ult:= aux; l.ant:= aux

fprocedimiento{l =�� pos=1}

{l =L 1L2..Ln � pos=i � 1�pos�n+1�� e=E }procedimiento inserta (e/s l:lista; e:elemento)var q:ptr fvar

new(q); q�.dato:=e; q�.sig:=l.ant�.sig;l.ant�.sig:=q;si l.ant=l.ult entonces l.ult:=q fsil.ant:=q

fprocedimiento{l=L’ 1L’ 2...L

’n+1�(L’ 1=L1...L’ i-1=Li-1)�L’ i=E�(L’ i+1=Li...L’n+1=Ln)�pos=i+1}

{l =L 1L2...Ln � pos=i � 1�pos�n }procedimiento suprime (e/s l:lista)var q:ptr fvar

si l.ant�.sig = l.ult entonces l.ult:= l.ant fsi;q:=l.ant�.sig;l.ant�.sig:=l.ant�.sig�.sig;dispose(q)

fprocedimiento{l=L’ 1 L’ 2...L

’n-1 �(L’ 1=L1...L’ i-1= Li-1)�(L’ i=Li+1...L’n-1= Ln)� pos=i }

{l = L 1L2...Ln � 1�pos�n }función recupera (l:lista) devuelve elemento devuelve (l.ant�.sig�.dato)ffunción{ recupera(l)=Lpos�� l = L1L2...Ln }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

44

{l=L 1 L2...Ln � 0�n}procedimiento principio (e/s l:lista);

l.ant:= l.pri;f procedimiento{l=L 1L2...Ln � pos=1}

{l=L 1L2...Ln � 0�n}procedimiento fin (e/s l:lista);

l.ant:= l.ult;ffprocedimiento{l=L 1L2...Ln � pos=n+1}

{l=L 1L2...Ln ��1�pos�n � pos=i}procedimiento siguiente (e/s l:lista);

l.ant:=l.ant�.sig;f procedimiento{ l=L 1L2...Ln ��pos=i+1}

{l=L 1L2...Ln � 0�n}función esvacial (l:Lista) devuelve Lógico

devuelve (l.pri=l.ult)ffunción{ esvacial(l)=(n=0) � l=L1L2...Ln }

{l=L 1L2...Ln � 0�n}función esfinl (l:Lista) devuelve Lógico

devuelve (l.ant=l.ult)ffunción{ esfin(l)=(pos=n+1) � l=L1L2...Ln }

ADII 98/99. Tema 3: Tipos Abstractos de Datos. Tipos Lineales.

45

Estudio comparativo de las implementaciones de Listas

COMPLEJIDAD TEMPORALSecuencial Enlazada

creal(l) �(1) �(1)inserta(l, x) �������(Nºelem) �(1)suprime(l) �������(Nºelem) �(1)

e:=recupera(l) �(1) �(1)b:=esvacial(l) �(1) �(1)

fin(l) �(1) �(1)primero(l) �(1) �(1)Siguiente(l) �(1) �(1)b:=esfin(l) �(1) �(1)

COMPLEJIDADESPACIAL

�(MaxL) �(Nºelem)

• La asignación enlazada requiere un espacio de memoriaadicional para los enlaces.

• Es fácil insertar o borrar un elemento en cualquier parte deuna lista cuando se usan enlaces, pues solo hay que cambiar dosde ellos. En el caso secuencial esta operación representa ungran consumo de tiempo.

• La representación enlazada facilita la unión de dos listas o suseparación.

• El esquema de enlaces se presta para obtener estructuras máscomplejas que las simples listas lineales