TIPO DE DATO ABSTRACTO ( TAD) Es un modelo matemático compuesto por una colección de operaciones definidas sobre un conjunto de datos

. Los Lenguajes de Programación Orientados a Objetos son lenguajes formados por diferentes métodos o funciones y que son llamados en el orden en que el programa lo requiere, o el usuario lo desea. La abstracción de datos, consiste en ocultar las características de un objeto y obviarlas, de manera que solamente utilizamos el nombre del objeto en nuestro programa. Ejemplo, Cuando yo digo la palabra “perro”, usted no necesita que yo le diga lo que hace el perro. INTERFAZ E IMPLEMENTACION. La solidez de un TDA reposa en la idea de que la implementación está escondida al usuario. Solo la interfaz es pública. Esto significa que el TDA puede ser implementado de diferentes formas, pero mientras se mantenga consistente con la interfaz, los programas que lo usan no se ven afectados. Un TDA lista puede ser implementado mediante un arreglo o una Lista Enlazada o hasta un Árbol binario de búsqueda. Una lista es un Tipo de Dato Abstracto con operaciones bien definidas (agregar elemento, agregar al final, agregar al principio, recuperar, eliminar, etc) mientras una lista enlazada es una estructura de datos basada en punteros o referencias (dependiendo del lenguaje) que puede ser usada para crear una representación de una Lista. La Lista Enlazada es comúnmente usada para representar una TDA Lista, y a veces, hasta confundida. Un ejemplo es la clase Linked List de Java, la cual ofrece una gran cantidad de métodos que no corresponden a una Lista Enlazada "pura", sino a un fuerte TDA. CARACTERIZACION. Un TDA está caracterizado por un conjunto de operaciones (funciones) al cual se denomina usualmente como interfaz pública y representa el comportamiento del TDA; mientras que la implementación como la parte privada del TDA está oculta al programa cliente que lo usa. Todos los lenguajes de alto nivel tienen predefinidos TDA; que son los tipos denominados simples y las estructuras predefinidas, y estos tienen sus interfaces públicas que incluyen las operaciones como la +, -, *, etc. Los TDA que tienen informaciones simples pero dependientes de un comportamiento estructural serán llamados polilíticos y aquellos TDA simples, como son los tipos predefinidos donde la información no es relacionada mediante ninguna estructura y no admiten más que un valor en cada momento será denominados TDA monolíticos.

a-. 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 y está constituida tanto por la maquinaria algorítmica que implemente la semántica de las operaciones como por los datos que sirvan de enlace entre los elementos del TDA, es decir, información interna necesaria para la implementación que se esté haciendo para ese comportamiento del TDA. Resumiendo podemos decir, que tanto la implementación de las operaciones como los elementos internos del TDA serán privados al acceso externo y ocultos 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).

EJEMPLOS DE USO DE LAS TDA Algunos ejemplos de utilización de TDAs en programación son:

Conjuntos: Implementación de conjuntos con sus operaciones básicas (unión, intersección y diferencia), operaciones de inserción, borrado, búsqueda...

Árboles Binarios de Búsqueda: Implementación de árboles de elementos, utilizados para la representación interna de datos complejos. Aunque siempre se los toma como un TDA separado son parte de la familia de los grafos.

 

Pilas y Colas: Implementación de los algoritmos FIFO y LIFO. Grafos: Implementación de grafos; una serie de vértices unidos mediante una serie de arcos o aristas. ESPECIFICACION DE LOS TAD El objetivo de la especificación es describir el comportamiento del TAD; consta de dos partes:

a-. La descripción matemática del conjunto de datos b-. La descripción matemática de las operaciones definidas en ciertos elementos de ese conjunto de datos. La especificación del TAD puede tener un enfoque informal, éste describe los datos y las operaciones relacionadas en lenguaje natural. Otro enfoque más riguroso, especificación formal, supone suministrar un conjunto de axiomas que describen las operaciones en su aspecto sintáctico y semántico. A-. Especificación informal de un TAD Consta de dos partes: 1. Detallar en los datos del tipo, los valores que pueden tomar. 2. Describir las operaciones, relacionándolas con los datos. El formato que generalmente se emplea, primero especifica el nombre del TAD y los

datos: TAD nombre del tipo (valores y su descripción) A continuación, cada una de las operaciones con sus argumentos, y una descripción funcional en lenguaje natural, con este formato: Operación(argumentos). Desarrollo de software. Tipos abstractos de datos 27 Descripción funcional A continuación se especifica, siguiendo esos pasos, el tipo abstracto de datos Conjunto: TAD Conjunto (colección de elementos sin duplicidades, pueden estar en cualquier orden, se usa para representar los conjuntos matemáticos con sus operaciones). Las operaciones básicas sobre conjuntos son las siguientes:

ESPECIFICACION FORMAL DE UN TAD La especificación formal proporciona un conjunto de axiomas que describen el comportamiento de todas las operaciones. La descripción ha de incluir una parte de sintaxis, en cuanto a los tipos de los argumentos y el tipo del resultado, y una parte de semántica que detalla para unos valores particulares de los argumentos la expresión del resultado que se obtiene. La especificación formal ha de ser lo bastante potente para que cumpla el objetivo de verificar la corrección de la implementación del TAD. El esquema que se sigue consta de una cabecera con el nombre del TAD y los datos: TAD nombre del tipo (valores que toman los datos del tipo) A continuación, la sintaxis de las operaciones que lista las operaciones mostrando los tipos de los argumentos y el tipo del resultado: Operación (Tipo argumento, ...) -> Tipo resultado

Se continúa con la semántica de las operaciones. Ésta se construye dando unos valores particulares a los argumentos, a partir de los cuales se obtiene una expresión resultado. Éste puede tener referencias a tipos ya definidos, valores de tipo lógico o referencias a otras operaciones del propio TAD. Operación (valores particulares argumentos) expresión resultado

Al realizar la especificación formal siempre hay operaciones definidas por sí mismas, se denominan constructores del TAD. Mediante los constructores se generan todos los posibles valores del TAD. Normalmente, se elige como constructor la operación que inicializa (por ejemplo, Conjunto vacío en el TAD Conjunto), y la operación que añade un dato o elemento (operación común a la mayoría de los tipos abstractos de datos). Se acostumbra a marcar con un asterisco a las operaciones que son constructores. OPERACIONES Y APLICACIONES DE LOS TAD. Tipos de Datos Abstractos (TDA) Un TDA es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema. Está formado por un conjunto válido de elementos y un número de operaciones primitivas que se pueden realizar sobre ellos. Ejemplo: - Definición del tipo Numero racional: Conjunto de pares de elementos (a,b) de tipo entero, con b<>0. - Operaciones: CrearRacional: Suma: Resta: Producto: División: Numerador: Denominador: ValorReal: MCD: Potencia: Simplifica: a, b (a,b) + (c,d) (a,b) - (c,d) (a,b) * (c,d) (a,b) / (c,d) (a,b) (a,b) (a,b) (a,b) (a,b)^c (a,b) = = = = = = = = = = ... (a^c , b^c) ( a/mcd(a,b) , b/mcd(a,b) ) (a,b) (a*d+b*c , b*d) (a*d-b*c , b*d) (a*c , b*d) (a*d , b*c) a b a/b

Una vez definido se podrán declarar variables de ese tipo y operar con ellas utilizando las operaciones que aporta el tipo. Ejemplo: TRacional r1,r2, rsuma;

CrearRacional(4,7, &r1); CrearRacional(5,8,&r2); Suma(r1, r2, &rsuma); printf(“El valor real es %f”, ValorReal(rsuma) ); Un TDA es el elemento básico de la abstracción de datos. Su desarrollo es independiente del lenguaje de programación utilizado, aunque este puede aportar mecanismos que faciliten su realización. Debe verse como una caja negra. En un TDA existen dos elementos diferenciados: - La Interfaz de utilización - La representación A la hora de utilizar el TDA, la representación debe permanecer oculta. Solo podremos utilizar las operaciones del tipo para trabajar con sus elementos.

Para construir un tipo abstracto debemos: 1. Exponer una definición del tipo. 2. Definir las operaciones (funciones y procedimientos) que permitan operar con instancias de ese tipo. 3. Ocultar la representación de los elementos del tipo de modo que sólo se pueda actuar sobre ellos con las operaciones proporcionadas. 4. Poder hacer instancias múltiples del tipo. ¨ Tipos básicos de operaciones en un TDA a- Constructores: Crean una nueva instancia del tipo. b-. Transformación: Cambian el valor de uno o más elementos de una instancia del tipo. c-. Observación: Nos permiten observar el valor de uno o varios elementos de una instancia sin modificarlos. d-. Iteradores: Nos permiten procesar todos los componentes en un TDA de forma secuencial.

IMPLEMENTACION DE LOS TAD

Una vez definido el TAD se escoge una representación interna utilizando los tipos que proporciona el lenguaje y/o otros TAD ya definidos previamente. La representación deberá ocultarse utilizando los mecanismos que nos proporcione el lenguaje. Ocultamiento de Información.

Normalmente la implementación del tipo se realiza en un módulo aparte que será enlazado al programa principal Se necesitará un fichero cabecera que contenga la definición de las operaciones y la declaración del tipo (representación). Con esta información se podrán definir elementos del tipo y acceder a sus operaciones LISTAS CIRCULARES. En este tipo de lista, para poder acceder a cualquier nodo de la lista, se modifica el algoritmo lineal y el último nodo en vez de apuntar a nulo, apunta al primer nodo generándose una estructura circular. PILAS. Una pila es una lista ordenada de elementos en el que todas las inserciones y eliminaciones se realizan por un mismo extremo de la lista. En una pila el último elemento añadido es el primero en salir de la pila. Por esa razón a las pilas se las denomina también listas LIFO (last input, firts output; último en entrar, primero en salir). IMPLEMENTACION FORMAL DEL TAD PILAS. Las pilas crecen y decrecen dinámicamente, es una estructura de datos dinámica. En cuanto a la representación de una pila, existen varias alternativas. Una primera representación podría ser mediante la estructura estática de un arreglo, de la cual ya indicamos la desventaja. Una segunda alternativa sería usando listas enlazadas. Las listas crecen y decrecen dinámicamente, al igual que ocurre con una pila. En esta representación dinámica se utilizan punteros y variables dinámicas.

IMPLEMENTACIÒN DEL TAD PILAS CON ARREGLOS

Un arreglo constituye el depósito de los elementos de la pila. El rango del arreglo debe ser lo suficientemente amplio para poder contener el máximo previsto de elementos de la pila. Un extremo del arreglo se considera el fondo de la pila, que permanecerá fijo. La parte superior de la pila, tope o cima, estará cambiando dinámicamente durante la ejecución del programa. Además del arreglo, una variable entera nos sirve para tener en todo momento el índice del arreglo que contiene el elemento tope. Las declaraciones, procedimientos y funciones para representar el TAD Pila, forman parte de la unidad pila. Max_elem= ...(Dependerá de cada realización) Tipo_elem=... (Tipo de los elementos de la pila) Pila= Registro Elem= arreglo [1..Max_elem] de Tipo_elem; Tope= entero;

FinRegistro.

IMPLEMENTACION DEL TAD PILAS CON VARIABLES DINAMICAS.

La implementación dinámica de una pila se hace almacenando los elementos como nodos de una lista enlazada, con la particularidad de que siempre que se quiera meter o sacar un elemento se hará por el mismo extremo.Esta realización tiene la ventaja de que el tamaño se ajusta exactamente a los elementos de la pila. Sin embargo, para cada elemento se necesita más memoria, ya que hay que guardar el campo de enlace. En la realización con arreglos hay que establecer un máximo de posibles elementos, aunque el acceso es más rápido, ya que se hace con una variable subindicada. Tipo_elem=... (Tipo de los elementos de la pila) Pila= hNodo; Nodo= Registro Elem= Tipo_elem; Sig= hNodo; FinRegistro

APLICACIONES DE PILAS

La Pila son utilizadas para solucionar una amplia variedad de problemas. Se utilizan en compiladores, en sistemas operativos y en programas de aplicación. Los casos más representativos son: · Llamada a subprogramas · Recursión · Tratamiento de expresiones aritméticas · Ordenación