0% encontró este documento útil (0 votos)
11 vistas20 páginas

Tema 11: Tipos de Datos Abstractos: 1.-Introducción Al Concepto de TDA

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
11 vistas20 páginas

Tema 11: Tipos de Datos Abstractos: 1.-Introducción Al Concepto de TDA

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 20

Tema 11: Tipos de Datos Abstractos

1.- Introducción al concepto de TDA

Es útil comparar el concepto de TDA con el de procedimiento. Los procedimientos


generalizan el concepto de operador. Evitan al programador limitarse a los operadores
incorporados en un lenguaje de programación, con el uso de procedimientos, el
programador es libre de definir sus propios operadores y aplicarlos a operandos que no
tienen por qué ser de tipo fundamental. Ej. : Multiplicación de matrices.

Otra ventaja de los procedimientos es que pueden utilizarse para encapsular partes de un
algoritmo, localizando en una sección de un programa todas las sentencias que incumben a
un aspecto del programa en concreto. Un ejemplo de encapsulación es el uso de un
procedimiento para leer todas las entradas y verificar su validez. La ventaja de realizar
encapsulación es que se sabe a donde ir para realizar cambios. Por ejemplo, si se produce
un fallo en la entrada de datos se sabe con exactitud donde están las líneas que provocan el
fallo.

Podemos ahora definir el concepto de tipo de dato abstracto (TDA) como un modelo
matemático con una serie de operaciones definidas en ese modelo. Un ejemplo de TDA son
los conjuntos de números enteros con las operaciones de unión, intersección y diferencia.
Las operaciones de un TDA pueden tener como operandos no solo los del TDA que se
define, sino también otros tipos de operandos, como enteros o de otros TDA, y el resultado
de una operación puede no ser un caso de ese TDA. Sin embargo, se supone que al menos
un operando, o el resultado, de alguna operación pertenece al TDA en cuestión.

Las propiedades de los procedimientos mencionadas anteriormente, generalización y


encapsulación, son igualmente aplicables a los tipos de datos abstractos. Los TDA son
generalizaciones de los tipos de datos primitivos (enteros, caracteres,...), al igual que los
procedimientos son generalizaciones de operaciones primitivas (suma, resta,...). Un TDA
encapsula cierto tipo de datos pues es posible localizar la definición del tipo y todas sus
operaciones en una sección del programa. De esta forma, si se desea cambiar la forma de
implementar un TDA, se sabe hacia dónde dirigirse, y revisando una pequeña sección del
programa se puede tener la seguridad que no hay detalles en otras partes que puedan
ocasionar errores relacionados con ese tipo de datos.

Una vez definido un TDA, éste se puede utilizar como si fuese un tipo de dato primitivo,
sin preocuparse por cual sea su implementación.

2.- Definición Tipos de Datos abstractos (TDA)

Un Tipo de dato abstracto puede definirse como un tipo de dato creado por el programador
(no provisto por el lenguaje) que representa un objeto del mundo real que es útil en el
dominio del problema. Así mismo un TDA puede verse como un es un modelo matemático
con una colección de operaciones definidas sobre el modelo.

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Para desarrollar un TDA deben definirse los objetos abstractos que pertenecen al mismo y
las operaciones a realizar sobre dichos objetos

3.- Ciclo de Vida de un TDA

Especificación Uso
Implementación
(Diseño)

Especificación: Especificación del objeto y sus propiedades (Definición formal del TDA):
En esta etapa del ciclo de vida se dan respuesta a preguntas como

Interrogantes Resultado
¿Cómo es la estructura del TDA? Invariante
¿Cuál es el conjunto de valores válidos?
Especificación Algebraica
¿Cuáles son sus operaciones?
Especificación Operacional

Invariante: Es una representación abstracta del objeto, sin comprometerse con una
estructura concreta ni con un tipo de lenguaje. Es una proposición lógica que expresa el
conjunto de valores válidos del TDA

Especificación Algebraica: El significado y efecto de las operaciones es descrito mediante


un conjunto de axiomas, en forma de ecuaciones, que relacionan dichas operaciones.

Especificación Operacional: se debe especificar dos partes bien definidas

 Sintaxis: Consiste en determinar como hay que escribir las operaciones de un TDA,
dando el tipo de operandos y el resultado.

 Semántica: La operación se representa mediante un procedimiento o una función,


con una precondición que indica las condiciones que deben cumplirse antes de
realizar la operación, y una postcondición que establece las condiciones que se
cumplen una vez realizada la operación. ( {P} S {Q} )

Implementación: Convertir el TDA en un código utilizable por una aplicación. Consiste en


tomar el diseño del TDA y convertirlo en algo real, en nuestro caso es llevarlo a un
lenguaje de computador. La implementación de un TDA no es única; dado un diseño de un
TDA es posible implementarlo de muy diversas formas.

Cada implementación puede ser distinta en dos aspectos básicos:

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


• Diseño de las Estructuras de Datos

• Desarrollo de las operaciones (Procedimientos y Funciones)

Uso: Aplicación del TDA para la resolución de un problema en una aplicación. Esta fase se
base en:
• Utilización del TDA dentro de una aplicación para la resolución de un problema
especifico.

• Como los TDAs se diseñan generales, no es extraño que un mismo TDA, se use en
muchas aplicaciones.

• Un TDA también puede ser usado para construir otros TDA`s

Características de los TDA

• Un TDA está caracterizado por un conjunto de operaciones (funciones) al cual le


denominaron usualmente como su interfaz pública y representan el comportamiento
del TDA.

• La implementación es la parte privada del TDA, está oculta al programa que lo usa.

• En un TDA no se necesita conocer como actúan tales operadores sobre la


representación interna de los tipos definidos, que además, suele ser una
implementación bastante dependiente de la máquina sobre la que trabaje el
compilador

• Los lenguajes actuales nos van a permitir ampliar los TDA predefinidos con otros
que serán definidos por el propio programador para adecuar así los tipos de datos a
las necesidades de los programas.

• Un TDA tendrá una parte que será invisible al usuario la cual hay que proteger y
que se puede decir que es irrelevante para el uso del usuario

• Tanto la implementación de las operaciones como los elementos internos del TDA
serán privados al acceso externo y oculto a cualquier otro nivel.

• Un TDA representa una abstracción:


• Se destacan los detalles (normalmente pocos) de la especificación (el qué).
• Se ocultan los detalles (casi siempre numerosos) de la implementación (el
cómo).

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


4.- Ejemplo de un TDA

Para ilustrar las ideas básicas desarrolladas a lo largo de esta sección vamos a desarrollar un
TDA, concretamente el TDA complejo.

INVARIANTE

1. ¿Cómo es la estructura del TDA?


Un número complejo es un objeto matemático que puede representarse como:

Una pareja ordenada, por ejemplo (2,3) ó


Como un polinomio, por ejemplo 2 + 3 i

En cualquiera de las dos presentaciones, un TDA Complejo contiene dos partes: la


real y la imaginaria.

2. ¿Cuál es el conjunto de valores válidos?


Esta se puede expresar en términos del conjunto de valores válidos de cada una de
las partes del TDA.

Formalmente se expresaría:

Invariante:
Complejo = (real, imaginario) ^ real Є R ^ imaginario Є I

ESPECIFICACIÓN OPERACIONAL

¿Cuáles son sus operaciones?

Los números complejos tienen asociados operaciones, como la suma, resta y


multiplicación. Si tenemos dos complejos: c1 = (r1, i1) y c2 = (r2, i2) , podemos definir
las operaciones como:

c1+ c2 = (r1 + r2, i1 + i2)


c1- c2 = (r1 - r2, i1 - i2)
c1. c2 = (r1 . r2 – i1 . i2, r2. i2 + r1 . i2)

Sintaxis:

Nombre Función
Crear Real * Real Complejo
Parte_Real Complejo Real
Parte_Imaginaria Complejo Real
Sumar Complejo * Complejo Complejo
Igual Complejo * Complejo Lógico

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Multiplicar Complejo * Complejo Complejo

Especificación Operacional:

Proc Crear (x1,x2 : Real; Ref x:Complejo )


{Pre:
Post: x = (x1,x2)
}

Func Parte_Real (x :Complejo):Real


{ Pre:
Post: Si x = (x1,x2) Entonces
Parte_Real = x1
}

Func Parte_Imaginaria (x :Complejo):Real


{ Pre:
Post: Si x = (x1,x2) Entonces
Parte_Imaginaria= x2
}

Proc Sumar (x,y : Complejo ; Ref z: Complejo)


{ Pre:
Post: z = x+y
Efecto: Si x = (x1,x2)  y = (y1, y2) Entonces
Z = (z1, z2) tq z1=x1+y1  z2 = x2+y2
}

Proc Igual ( x,y : Complejo ): Lógico


{ Pre:
Post: Igual = (x = y)
Efecto: Si x = (x1,x2)  y = (y1, y2) Entonces
Si (x1 = y1)  (x2 = y2) Entonces
Igual=Verdad
Sino
Igual=Falso
}

Proc Multiplicar (x,y : Complejo, Ref z: Complejo)


{ Pre:
Post: z = x * y
Efecto: Si x = (x1,x2)  y = (y1, y2) Entonces
Z = (z1, z2) tq z1=(x1*y1) – (x2 * y2)  z2 = (x1*y2) + (y1*y2)
}

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


IMPLEMENTACIÓN DEL TDA COMPLEJO

//Definición del tipo Complejo en la zona de declaración de tipos


Tipo Complejo = Registro
{
Preal: real
Pimaginaria: real
}

Proc Crear (x1,x2 : Real; Ref x:Complejo )


Inicio
x . Preal = x1
x . Pimaginaria = x2
Fproc

Func Parte_Real (x :Complejo):Real


Inicio
Parte_Real = x . Preal
Ffunc

Func Parte_Imaginaria (x :Complejo):Real


Inicio
Parte_imaginaria = x . Pimaginaria
Ffunc

Proc Sumar ( x,y: Complejo ; Ref z: Complejo )


Inicio
z. Preal = x1
z.Pimaginaria= x2
Fproc

Func Igual ( x,y : Complejo ): Lógico


Inicio
Igual= (x.Preal = y.Preal)  (x.Pimaginaria = y.Pimaginaria)
Ffunc

Proc Multiplicar (x,y : Complejo ; Ref z: Complejo)


{
z.Preal = (x.Preal*y.Preal)-(x.Pimaginaria*y.Pimaginaria)
z.Pimaginaria = (x.Preal*y.Pimaginaria)+(y.Preal*y.Pimaginaria)

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


5.- TDA: Estructuras Lineales. Listas, Pilas y Colas

a.- Listas: Definiciones y Conceptos Básicos

Una lista es una secuencia de cero o más elementos de un mismo tipo. Una lista se
representa como una sucesión de elementos separados por comas

L = e1, e2, , en

donde n  0 y cada ei (1  i  n) es del mismo tipo.

Si n = 0, se tiene una lista vacía, es decir, un caso particular de una lista que no tiene
elementos. Esta lista vacía se representa mediante la notación  .

Si n  1 entonces e1 es el primer elemento de la lista, e n es el último elemento y la lista


formada por los elementos e2, e3, , en es el resto de la lista inicial.
La longitud de una lista se define como el número de elementos que la componen. La
longitud de la lista vacía es 0.
La posición de un elemento dentro de una lista es el lugar ocupado por dicho elemento
dentro de la secuencia de valores que componen la estructura. Se dice que el elemento e i (1
 i  n) se encuentra en la posición i.

Sea L = e1, e2, , en una lista no vacía.


Para cada elemento en L, excepto el último, existe un elemento único que le sigue llamado
sucesor.
Para cada elemento en L, excepto el primero, existe un elemento único que le precede
llamado predecesor.

Sean L1 = a1, a2, , an y L2 = b1, b2, , bm dos listas. Se dice entonces que:
 L1 y L2 son iguales si y sólo si tienen el mismo número de elementos y son iguales uno
a uno.
L1 y L2 son iguales  (m = n)  i (1  i  n) (ai = bi)

 L1 y L2 son semejantes si y sólo si tienen los mismos elementos aunque estén en


diferente orden.

 L2 es una sublista de L1 si y sólo si todos los elementos de L 2 se encuentran en L1 en el


mismo orden y de manera consecutiva.
 L2 está contenida en L1 si y sólo si todos los elementos de L 2 se encuentran en L1
aunque estén en diferente orden.
 L1 está ordenada ascendentemente si y sólo si i (1  i < n) (ai  ai1)

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


 L1 está ordenada descendentemente si y sólo si i (1  i < n) (ai  ai1)

Especificación del TDA Lista

TDA Lista [ Elemento ]

INVARIANTE

Lista = a1, a2, , an  i (1  i < n) (ai  Elemento)

ESPECIFICACIÓN OPERACIONAL

Sintaxis

vacíaL :  Lista
es_vacíaL : Lista  Booleano
insertar : Lista  Natural  Elemento  Lista
eliminar : Lista  Natural  Lista
consultar : Lista  Natural  Elemento
localizar : Lista  Elemento  Entero
resto: Lista  Lista
longitud : Lista  Natural

Semántica

{ Pre: }
procedimiento vacíaL (var L: Lista )
{ Post: vacíaL    }

{ Pre: }
función es_vacíaL (L : Lista) : Booleano;
{ Post: es_vacíaL  ( L =   ) }

{ Pre: 1  p  longitud(L) + 1 }
procedimiento insertar (var L : Lista; p : Entero; e : Elemento)
{ Post:
Si L = e1, , ep1, ep, , en entonces
L´ = e1, , ep1, e, ep, , en }

{ Pre: 1  p  longitud(L) }
procedimiento eliminar (var L : Lista; p : Entero)
{ Post:
Si L = e1, , ep1, ep, ep1, , en entonces
L´ = e1, , ep1, ep1, , en }

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


{ Pre: 1  p  longitud(L) }
función consultar (L : Lista; p : Entero) : Elemento;
{ Post: Si L = e1, , ep1, ep, ep1, , en entonces consultar  ep }

{ Pre: }
función localizar (L : Lista; e : Elemento) : Entero;
{ Post:
Si L =   entonces localizar  0
Si L = e1, e2, , en  i (1  i  n) (ei  e) entonces localizar  0
Si L = e1, e2, , en  i (1  i  n) (ei  e) entonces localizar  i }

{ Pre: es_vacía(L) }
procedimiento resto (var L : Lista)
{ Post:
Si L = e1, e2 , ep1, ep, ep1, , en entonces
L´ = e2, , ep1, ep1, , en }

{ Pre: }
función longitud (L : Lista) : Entero;
{ Post:
Si L =   entonces longitud  0
Si L = e1, e2, , en entonces longitud  n }

Implementación del TDA Lista

Representación Estática

En esta implementación se supone que se cumplen todas las precondiciones planteadas en


la especificación pre / post de cada operación.

Parte 1: Representación

Definición de la estructura de datos que representa a los objetos del TDA.


Se selecciona la representación de listas secuenciales: Los elementos de la lista se
almacenan en forma contigua en posiciones consecutivas de un arreglo.

constante
N=? (Constante predefinida)
tipo
Elemento = ? (Elemento genérico)
Lista = registro
elems : arreglo [1 .. N] de Elemento;
último : [0 .. N]

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


fregistro;

Parte 2: Operaciones

Implementación de las operaciones en términos de las estructuras de datos que representan


los objetos del TDA.

proc vacíaL(Ref L: Lista)


Inicio
L.último  0
finproc

func es_vacíaL(L: Lista): Booleano


Inicio
es_vacíaL  (L.último = 0)
finfunc

proc insertar(Ref L: Lista; pos: Entero; e: Elemento)


variable
i : Entero
Inicio
si (L.último < N) entonces
para i  L.último  1 [decrementando] hasta pos  1 hacer
L.elems[i]  L.elems[i1]
fpara;
L.elems[pos]  e
L.último  L.último  1
fsi
finproc

proc eliminar(var L: Lista; pos: Entero);


variable
i : Entero
Inicio
L.último  L.último  1
para i  pos hasta L.último hacer
L.elems[i]  L.elems[i1]
fpara
finproc

func consultar(L: Lista; pos: Entero): Elemento

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Inicio
consultar  L.elems[pos]
finfunc

func localizar(L: Lista; e: Elemento): Entero


variable
i : Entero
Inicio
si (L.último = 0) entonces
localizar  0
sino
i1
mientras (i < L.último)  (L.elems[i]  e) hacer
ii1
fmientras

si (L.elems[i] = e) ent
localizar  i
sino
localizar  0
fsi
fsi
finfunc

proc resto(var L: Lista)


variable
i : Entero
Inicio
L.último  L.último  1
para i  1 hasta L.último hacer
L.elems[i]  L.elems[i1]
fpara
finproc

funci longitud(L: Lista): Entero


Inicio
longitud  L.último
finfunc

b.- Pilas: Definiciones y Conceptos Básicos

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Una pila (stack) es una lista cuyos elementos solamente pueden ser consultados, insertados
o eliminados por uno de sus extremos.

Eliminar Insertar

Las pilas se denominan también estructuras LIFO (Last In, First Out) porque su
característica principal es que el último elemento en llegar es el primero en salir.
En todo momento, el único elemento visible de la estructura es el último que se colocó. Se
define el tope de la pila como el punto en el cual se encuentra dicho elemento, y el fondo de
la pila como el punto en el cual se encuentra el primer elemento incluido en la estructura.

Tope

Fondo

Si una pila no contiene elementos, se dice que se encuentra vacía, y no tiene sentido
referirse a su tope ni a su fondo.
Las pilas son muy utilizadas en programación para realizar tareas tales como:

 Evaluación de expresiones
 Reconocimiento de lenguajes
 Recorrido de árboles
 Simulación de procesos recursivos

Especificación del TDA Pila

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


TDA Pila [ Elemento ]

INVARIANTE
Pila = a1, a2, , an  i (1  i < n) (ai  Elemento)

ESPECIFICACIÓN OPERACIONAL

Sintaxis

vacíaP :  Pila
es_vacíaP : Pila  Booleano
apilar : Pila  Elemento  Pila
desapilar : Pila  Pila
tope : Pila  Elemento

Semántica

{ Pre: }
procedimiento vacíaP (var P: Pila ) : Pila;
{ Post: P´    }

{ Pre: }
función es_vacíaP (P : Pila) : Booleano;
{ Post: es_vacíaP  ( P =   ) }

{ Pre: }
procedimiento apilar (var P : Pila; e : Elemento) : Pila;
{ Post: Si P = e1, e2, , en entonces P´  e, e1, e2, , en }

{ Pre: es_vacíaP(P) }
procedimiento desapilar (var P : Pila) : Pila;
{ Post: Si P = e1, e2, , en entonces P´  e2, e3, , en }

{ Pre: es_vacíaP(P) }
función tope (P : Pila) : Elemento;
{ Post: Si P = e1, e2, , en entonces tope  e1 }

Implementación del TDA Pila

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Representación Estática

En esta implementación se supone que se cumplen todas las precondiciones planteadas en


la especificación pre / post de cada operación.

Parte 1: Representación

Definición de la estructura de datos que representa a los objetos del TDA.


Se selecciona la representación de listas secuenciales: Los elementos de la pila se
almacenan en forma contigua en posiciones consecutivas de un arreglo.

constante
N=?
tipo
Elemento = ? (Elemento genérico)
Pila = registro
elems: arreglo[1 .. N] de Elemento
top: [0 .. N]
fregistro;

Parte 2: Operaciones

Implementación de las operaciones en términos de las estructuras de datos que representan


los objetos del TDA.

proc vacíaP(var P: Pila)


Inicio
P.top  0
finproc

func es_vacíaP(P: Pila): Booleano


Inicio
es_vacíaP  ( P.top = 0 )
finfunc

proc apilar(var P: Pila; e: Elemento)


Inicio
si ( P.top < N ) entonces
P.top  P.top  1
P.elems[ P.top ]  e
fsi

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


finproc

proc desapilar(var P: Pila)


Inicio
P.top  P.top  1
finproc

funci tope(P: Pila): Elemento


comienzo
tope  P.elems[P.top]
finfunc

Implementación del TDA Pila: Representación con Listas

En esta implementación se supone que se cumplen todas las precondiciones planteadas en


la especificación pre / post de cada operación.

Parte 1: Representación

Definición de la estructura de datos que representa a los objetos del TDA.


En esta implementación se utiliza un objeto abstracto del TDA Lista para representar una
pila.

tipo
Pila = Lista;

Parte 2: Operaciones

Es suficiente con expresar las operaciones del TDA Pila en términos de las operaciones del
TDA Lista.

proc vacíaP(var P: Pila)


Inicio
vacíaL(P)
finproc

func es_vacíaP(P: Pila): Booleano


Inicio
es_vacíaP  es_vacíaL(P)
finfunc

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


proc apilar(var P: Pila; e: Elemento)
Inicio
insertar(P, 1, e)
finproc

proc desapilar(var P: Pila)


Inicio
eliminar(P, 1)
finproc

func tope(P: Pila): Elemento


Inicio
tope  consultar(P, 1)
finfunc

c.- Colas: Definiciones y Conceptos Básicos

Una cola (queue) es una lista cuyos elementos solamente pueden ser insertados por uno de
sus extremos y eliminados o consultados por el otro.

Eliminar Insertar

Las colas se denominan también estructuras FIFO (First In, First Out) porque su
característica principal es que el primer elemento en llegar es el primero en salir.
En todo momento, el único elemento visible de la estructura es el primero que se colocó y
mientras éste no haya salido no es posible tener acceso al siguiente elemento. Se define el
frente de la cola como el punto en el cual se encuentra el primer elemento.
Si una cola no contiene elementos, se dice que se encuentra vacía, y no tiene sentido
referirse a su frente.
Las colas son muy utilizadas en programación para realizar tareas tales como:
 Procesos de simulación en los cuales se quiere determinar el comportamiento de un
sistema que presta un servicio a un conjunto de usuarios que esperan mientras les toca
el turno de ser atendidos. Ejemplos de estos sistemas son los bancos, los aeropuertos y
los procesos dentro de un computador
 Algoritmos de recorrido de árboles y grafos

Especificación del TDA Cola

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


TDA Cola [ Elemento ]

INVARIANTE
Cola = a1, a2, , an  i (1  i < n) (ai  Elemento)

ESPECIFICACIÓN OPERACIONAL

Sintaxis

vacíaC :  Cola
es_vacíaC : Cola  Booleano
encolar : Cola  Elemento  Cola
desencolar : Cola  Cola
frente : Cola  Elemento

Semántica

{ Pre: }
procedimiento vacíaC (var C: Cola )
{ Post: C´    }

{ Pre: }
función es_vacíaC (C : Cola) : Booleano;
{ Post: es_vacíaC  ( C =   ) }

{ Pre: }
procedimiento encolar (var C : Cola; e : Elemento) : Cola
{ Post: Si C = e1, e2, , en entonces C´  e1, e2, , en, e }

{ Pre: es_vacíaC(C) }
procedimiento desencolar (var C : Cola)
{ Post: Si C = e1, e2, , en entonces C´  e2, e3, , en }

{ Pre: es_vacíaC(C) }
función frente (C : Cola) : Elemento
{ Post: Si C = e1, e2, , en entonces frente  e1 }

Implementación del TDA Cola

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Representación Estática

En esta implementación se supone que se cumplen todas las precondiciones planteadas en


la especificación pre / post de cada operación.

Parte 1: Representación

Definición de la estructura de datos que representa a los objetos del TDA.

Se selecciona la representación de vectores circulares: Se colocan dos campos en la


estructura que indican las posiciones en las cuales se encuentran el primer y el último
elemento de la cola, de manera tal que sólo el espacio comprendido entre estas dos marcas
se encuentre ocupado por los elementos de la cola.

Se debe tener en cuenta que la posición siguiente a una posición i de un arreglo de


dimensión N está dada por ( i mod N )  1 ( 1  i  N ).

Esto lleva a definir la función sig que suma 1 a la posición i en el sentido circular,
retornando la posición siguiente a la posición i.

Las estructuras de datos para vectores circulares se declaran de la siguiente manera:

constante
N=?
tipo
Elemento = ? (Elemento genérico)

Cola = registro
elems: arreglo[1 .. N] de Elemento
pri, ult: [1 .. N]
n_elems: [0 .. N]
fregistro

func sig(i: Entero): Entero


Inicio
sig  (i mod N)  1
finfunc

Parte 2: Operaciones

Implementación de las operaciones en términos de las estructuras de datos que representan


los objetos del TDA.

procedimiento vacíaC(var C: Cola)

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


Inicio
C.pri  1
C.ult  N
C.n_elems  0
finproc

func es_vacíaC(C: Cola): Booleano


Inicio
es_vacíaC  ( C.n_elems = 0 )
finfunc

proc encolar(var C: Cola; e: Elemento)


Inicio
si (C.n_elems < N) entonces
C.ult  sig( C.ult )
C.elems[ C.ult ]  e
C.n_elems  C.n_elems  1
fsi
finproc

proc desencolar (var C: Cola)


Inicio
C.pri  sig( C.pri )
C.n_elems  C.n_elems  1
finproc

func frente(C: Cola): Elemento


Inicio
frente  C.elems[ C.pri ]
finfunc

Implementación del TDA Cola: Representación con Listas

En esta implementación se supone que se cumplen todas las precondiciones planteadas en


la especificación pre / post de cada operación.

Parte 1: Representación

Definición de la estructura de datos que representa a los objetos del TDA.


En esta implementación se utiliza un objeto abstracto del TDA Lista para representar una
cola.

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos


tipo
Cola = Lista

Parte 2: Operaciones

Es suficiente con expresar las operaciones del TDA Cola en términos de las operaciones del
TDA Lista.

proc vacíaC(var C: Cola)


Inicio
vacíaL(C)
finproc

func es_vacíaC(C: Cola): Booleano


Inicio
es_vacíaC  es_vacíaL(C)
finfunc

proc encolar(var C: Cola; e: Elemento)


Inicio
insertar(C, longitud(C)  1, e)
finproc

proc desencolar(var C: Cola);


Inicio
eliminar(C, 1)
finproc

func frente(C: Cola): Elemento


Inicio
frente  consultar(C, 1)
finfunc

CS0118 – Algoritmos y Programación I Tipos de Datos Abstractos

También podría gustarte