Está en la página 1de 21

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

TIPOS DE DATOS ABSTRACTOS (TAD)


Se llama abstraccin de datos o Tipo Abstracto de Datos (TAD) al conjunto de valores que pueden tomar los datos de ese tipo, juntamente con las operaciones que los manipulan; stos se definen mediante una especificacin que es independiente de cualquier implementacin. La palabra abstracto se utiliza en este caso en el sentido de que los datos del tipo pueden ser manipulados mediante sus operaciones, sin necesidad de ningn conocimiento adicional sobre el tipo, nicamente conociendo las propiedades de las operaciones. Los TADS ms utilizados son las listas, pilas, colas, rboles y grafos.

Pilas

Una pila es una secuencia de elementos, en la que las operaciones que es posible realizar se limitan a introducir y sacar elementos de uno en uno. Estas operaciones se realizan por uno de sus extremos y slo por uno, al que llamaremos tope o cima. Se cumple, adems, que el elemento que sacamos de la pila es el ltimo que ha sido introducido. Tambin se les denomina estructuras LIFO (Last In First Out), es decir, el ltimo que entra es el primero que sale. El hecho de que las operaciones se realicen slo por un extremo, implica que el nico elemento accesible de la pila es el que se encuentra en el tope. De esto se deduce que para obtener todos los elementos de una pila es necesario destruirla. Las pilas pertenecen al tipo de estructuras de datos lineales, ya que los elementos ocupan lugares sucesivos en la estructura. Un ejemplo intuitivo de pila es una serie de platos puestos uno encima de otro, de tal forma que slo es 'aconsejable' quitar o poner platos del tope superior. Cuando se desea recorrer una secuencia de elementos en sentido inverso, se introducen los elementos en una pila y se van visualizando extrayndolos del tope. Grficamente es comn representar una pila de la forma que indican las figuras:
Ana Mara Clos 1

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

1.1 Aplicaciones de las pilas.


Las pilas son una estructura de datos muy usada en la solucin de diversos tipos de problemas. Los casos ms representativos son: o Solitarios, Laberintos: el salir de un laberinto supone muchas veces volver hacia atrs sobre los pasos andados. La idea de ir hacia atrs en la ltima decisin y ver otro camino se llama vuelta atrs (back tracking). La vuelta atrs es una tcnica muy til para resolver problemas. Puesto que se necesita recordar dnde se ha estado, en sentido inverso, una pila es una estructura de datos adecuada para la vuelta atrs. o Evaluacin de expresiones aritmticas, conversin de notaciones (posfija, prefija, infija)... o Llamadas a subprogramas o Recursin.

1.2 Operaciones bsicas de una pila


Las operaciones necesarias para la manipulacin de una pila son las siguientes:
Ana Mara Clos 2

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

isVacia() Es un mtodo booleano que devuelve falso o verdadero segn la pila contenga algn elemento o ninguno. isLlena() Es un mtodo booleano que devuelve falso o verdadero segn la memoria tenga o no espacio suficiente para agregar otro elemento a la pila. tope() Devuelve el valor que hay en el tope de la pila, es decir, el ltimo elemento que se introdujo. Si la pila est vaca se considera error. pop() Esta operacin extrae y devuelve el elemento ubicado al tope de la pila. No se pueden suprimir elementos de una pila vaca. push() Inserta un elemento en la parte superior de la pila, pasando ste a ser el nuevo tope de la misma. vaciar() Esta operacin elimina todos los elementos de la pila, y la convierte en una pila vaca.

1.3 Implementacin de pilas


La implementacin de la pila puede realizarse de dos modos: usando vectores y usando referencias (enlazada). La diferencia entre ambas realizaciones, surge del hecho de que la primera establece a priori el tamao de la pila y este tamao se conservar a lo largo de toda la implementacin, haciendo que la capacidad de almacenamiento sea limitada. Por el contrario, la segunda realizacin utiliza variables dinmicas, por lo que slo se utiliza en cada

Ana Mara Clos

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

momento la memoria necesaria para almacenar los elementos que estn presentes en la estructura.

1.4 Pila dinmica


Para implementar una pila genrica utilizamos una clase Pila y dentro de sta, la clase interna Nodo. Adems se requiere de otra clase que defina el modelo de datos a utilizar. En siguiente ejemplo se utiliza la clase Persona, pero podra ser cualquier otra. public class Pila{ private Nodo tope; public Pila(){ tope=null; } public boolean isVacia(){ if(tope==null) return true; else return false; } public boolean isLlena(){ Nodo nuevo=new Nodo(); if(nuevo==null) return true; else return false; } public boolean push(Object e){ if(!isLlena()){ Nodo nuevo=new Nodo(e); nuevo.siguiente=tope; tope=nuevo; return true; } else return false; } public Object pop(){ if(!isVacia()){ Object elemento=tope.elemento; tope=tope.siguiente; return elemento; }
Ana Mara Clos 4

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

else return null; } public Object tope(){ if(!isVacia()) return tope.elemento; else return null; } public String toString(){ Nodo nodo=tope; String texto=""; while(nodo!=null){ texto=texto+nodo.elemento+"\n"; nodo=nodo.siguiente; } return texto; } private class Nodo{ private Object elemento; private Nodo siguiente; public Nodo(){ } public Nodo(Object e){ elemento=e; siguiente=null; } } }

1.5 Ejemplo del uso de una pila


En el siguiente cdigo se muestra un ejemplo de cmo usar una pila. public class Principal{ public static void main(String [] args){ Pila pila=new Pila(); pila.push(new Persona(123,"Ana")); pila.push(new Persona(456,"Pepe")); System.out.println("Pila "); System.out.println(pila); System.out.println("Tope: "+pila.tope()); Persona persona=(Persona)pila.pop(); System.out.println("\nPila despus de pop"); System.out.println(pila); System.out.println("se extrajo "+persona); }
Ana Mara Clos 5

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

} Un detalle a tener en cuenta es que la pila funciona con un objeto genrico perteneciente a la clase Object. Cuando se utiliza un mtodo genrico de cualquier Object se puede invocar directamente, como cuando se escribe pila.tope().toString(). Si se necesita usar un mtodo particular de una clase, como getNombre(), que es propio de Persona, hay que convertir el Object en una Persona mediante un cast, como en (Persona)pila.tope().

1.6 Recorrido de una pila


Para recorrer una pila, hay que deshacerla. Si se desea conservar el contenido se debe almacenar en otra estructura de datos: array, archivo, pila, etc. Este fragmento muestra como recorrer la pila, sin conservar el contenido. Utiliza un mtodo esttico: public static void mostrar(Pila pila){ int i=0; Rectangulo rect=null; System.out.println("La pila es:"); while(!pila.isVacia()){ rect=(Rectangulo) pila.pop(); System.out.println(rect); } }

1.7 Colecciones de Java


El lenguaje Java posee el framework Collections que permite manejar colecciones de objetos en una misma unidad. Dentro de las colecciones, existen clases apropiadas para uso de TADs.

Ana Mara Clos

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

1.8 La clase Stack


El lenguaje Java permite la implementacin de pilas, a travs de la clase Stack. Esta clase requiere que se importe el paquete java.util.Stack.

1.9 Ejercicios
1) Utilizar un men para implementar las funciones bsicas de una pila. 2) Ingresar una lnea de texto. Utilizar una pila para mostrar la lnea invertida. Cada elemento de la pila es un objeto de la clase Character. 3) Utilizar una pila para determinar si una cadena sin espacios ni otros separadores, es palndromo. Con mayor dificultad, considerar que puede tener espacios como separadores. 4) Utilizar una pila para evaluar una expresin postfija (con nmeros dgitos), suponiendo que es vlida. La pila se carga con elementos de tipo Integer. Utilizar como ejemplo 6 2 + 5 * 8 4 / - que se resuelve de la siguiente forma:

6+2=8 8*5=40 40-2=38 8/4=2

Colas

La estructura de cola se puede describir de forma intuitiva con ejemplos de la vida cotidiana. Por ejemplo, las personas esperando para usar un telfono pblico: cuando llega alguien que quiere llamar debe colocarse detrs del ltimo, y la primera persona de la cola ser la primera que use el telfono. Formalmente, podemos definir la estructura cola, como una secuencia de elementos a1,a2,...an, en la que la adicin de nuevos elementos se realiza por un extremo al que llamaremos final, y la extraccin de elementos de la estructura se realiza por el otro, que llamaremos principio.
Ana Mara Clos 7

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Los elementos se eliminan en el mismo orden en que se insertaron, por lo tanto el primero que entra en la cola es el primero que sale. Tambin se les denomina estructuras FIFO (First In First Out). En una cola, slo son accesibles los elementos primero y ltimo. Las colas, al igual que las pilas, son estructuras de datos lineales. Grficamente, las colas se representan de la siguiente forma:

2.1 Aplicaciones de las colas.


Una aplicacin de las colas es la simulacin por computadora de una situacin del mundo real. Las colas tambin se utilizan en muchas partes del sistema operativo, como la asignacin de recursos de una computadora. En este caso, las distintas tareas de los usuarios deben esperar en una cola a que est disponible el recurso que necesitan.

Operaciones bsicas de una cola

Las operaciones que se pueden realizar sobre una cola son similares a las de manejo de pilas. isVacia() Es un mtodo booleano que devuelve false o true segn la cola contenga algn elemento o ninguno. isLlena() Es un mtodo booleano que indica si hay espacio en la memoria para agregar un elemento ms a la cola. agregar()
Ana Mara Clos 8

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Aade un elemento al final de la cola. extraer() Elimina el primer elemento de la cola. Es condicin de error si se intenta suprimir un elemento de una cola vaca.

3.1 Implementacin de colas


La idea es muy similar a la de las pilas enlazadas, con la salvedad de que se inserta siempre por el final y se saca siempre por el principio. Principio y fin son dos objetos que apuntan al primer y ltimo elemento de la cola respectivamente. public class Cola{ protected Nodo principio,fin; public Cola(){ principio=null; fin=null; } private class Nodo{ private Object elemento; private Nodo siguiente; public Nodo(){ } public Nodo(Object e){ elemento=e; } } public boolean isVacia(){ if(principio==null) return true; else return false; } public boolean isLlena(){ Nodo nuevo=new Nodo(); if(nuevo==null) return true; else return false; } public boolean agregar(Object e){ if(!isLlena()){ Nodo nuevo=new Nodo(e);
Ana Mara Clos 9

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

if(isVacia()) principio=nuevo; else fin.siguiente=nuevo; fin=nuevo; return true; } else return false; } public Object extraer(){ if(!isVacia()){ Object elemento=principio.elemento; if(principio==fin) vaciar(); else principio=principio.siguiente; return elemento; } else return null; } public String toString(){ Nodo nodo=principio; String texto=""; while(nodo!=null){ texto=texto+nodo.elemento+"\n"; nodo=nodo.siguiente; } return texto; } }

3.2 Ejemplo del uso de una cola


En el siguiente cdigo se muestra un ejemplo de cmo usar una cola. public class Principal{ public static void main(String [] args){ Cola cola=new Cola(); cola.agregar(new Persona(123,"Ana")); cola.agregar(new Persona(456,"Pepe")); System.out.println("Cola "); System.out.println(cola); Persona persona=(Persona)cola.extraer(); System.out.println("\nCola despus de extraer"); System.out.println(cola);
Ana Mara Clos 10

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

System.out.println("se extrajo "+persona); }

3.3 Recorrido de una cola


Al igual que ocurre con una pila, para recorrer la cola hay que deshacerla. Este fragmento muestra como recorrer la cola, sin conservar el contenido. public static void mostrar(Cola cola){ int i=0; Rectangulo rect=null; System.out.println("La cola es:"); while(!cola.isVacia()){ rect=(Rectangulo)cola.extraer(); System.out.println(rect); } }

3.4 La clase LInkedBlockingQueue


El lenguaje Java permite la implementacin de colas, a travs de la clase LinkedBlockingQueue. Esta clase requiere que se importe el paquete java.util.concurrent.LinkedBlockingQueue.

3.5 Ejercicios
1) Implementar un men para manejo de colas. 2) Cargar una cadena en una cola y en una pila simultneamente. Extraer elementos de la cola y la pila, compararlos y decir si la cadena es un palndromo. 3) Una seccin de un ministerio distribuye nmeros para atencin del pblico de 8 a 9 h. Con un mximo de 50 nmeros y a partir de las 9 comienza a atender. Suponga que todas las personas que retiran nmero se quedan en la cola hasta que la atiendan.
Ana Mara Clos 11

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Para cada persona se conoce la siguiente informacin:

Nombre y apellido Tiempo requerido para su atencin

La ventanilla cierra a las 11 horas, por lo tanto, si la suma de los tiempos de atencin supera este mximo quedarn personas sin atender. Informar:

El nmero de personas atendidas. La cantidad de personas que quedaron sin atender. El nombre de la ultima persona atendida y el de la primera

persona sin atender (si existe) Cargar los datos desde un archivo

Listas

Las listas, como las pilas y colas, son estructuras lineales de datos. Esto quiere decir que cada elemento tiene un nico sucesor, (excepto el ltimo) y un nico antecesor (excepto el primero). Las listas pueden implementarse de distintas formas: listas con arrays, listas con cursores y listas con punteros. Las listas son muy verstiles; cualquier elemento pude insertarse, eliminarse, modificarse, consultarse, etc. Pueden crearse en forma ordenada o desordenada.

4.1 Listas doblemente enlazadas


Son estructuras dinmicas de datos. Su tamao vara en tiempo de ejecucin. Permiten agregar y extraer elementos en cualquier parte de la secuencia. Los elementos no se almacenan en posiciones contiguas de memoria. Cada elemento se almacena en un nodo que contiene los datos que se desean guardar y una referencia al anterior y al siguiente nodo de la lista. Para acceder a toda la lista se almacena una referencia al primer elemento y al ltimo elemento.

Ana Mara Clos

12

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

4.2 Listas en Java


Se utiliza la interfaz List, que extiende la interfaz Collection. Hay dos implementaciones de List: ArrayList y LinkedList. ArrayList: se implementa con arrays. Su uso es ms conveniente para agregar elementos al final de la lista y cuando se necesita un acceso aleatorio a sus elementos. LinkedList: se implementa con enlaces dobles en memoria. Su uso es ms conveniente para agregar y eliminar elementos en la mitad de la lista y acceder a los elementos secuencialmente.

La ventaja de tener una interfaz comn es que puede utilizarse cualquier implementacin, modificando levemente el programa fuente.

4.3 La clase LInkedList


Esta clase requiere que se importe el paquete java.util.LinkedList.

4.4 Implementacin a partir de la versin 5


A partir de la versin 5 de J2SE, se promueve el uso de genricos. stos permiten que las colecciones respondan a un tipo especfico de clase y no admitan ninguna otra. La clase permitida se coloca entre los smbolos de menor y mayor, como se indica en el ejemplo. LinkedList<Articulo> lista=new LinkedList<Articulo>();
Ana Mara Clos 13

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

4.5 Mtodos de LInkedList


Elemento es cualquier clase genrica colocada en el constructor entre < >.

4.5.1.

Mtodos para agregar

El mtodo add(Elemento e) agrega un elemento al final de la lista. Retorna un valor booleano que indica si se pudo o no agregar. boolean ok = lista.add(articulo); El mtodo add(int indice, Elemento e) agrega un elemento en la posicin indicada. lista.add(5,elemento); Si el ndice est fuera de rango se lanza una excepcin de tipo IndexOutOfBoundsException. Se permiten los ndices entre cero y el tamao de la lista. El mtodo addFirst(Elemento e) agrega un elemento al comienzo de la lista. lista.addFirst(elemento); El mtodo addLast(Elemento e) agrega un elemento al final de la lista. lista.addLast (elemento);

4.5.2.

Mtodo void clear()

Elimina todos los elementos de la lista.


Ana Mara Clos 14

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

lista.clear ();

4.5.3.

Mtodo boolean contains(Object o)

Retorna true si la lista contiene al elemento considerado. boolean ok=lista.contains(elemento); Debe sobrescribirse el mtodo equals() de la clase Modelo para comparar con un objetos especfico. Por ejemplo, para comparar un rectngulo con otro: public boolean equals(Object o){ Rectangulo rect=(Rectangulo)o; if(base==rect.base && altura==rect.altura) return true; else return false; }

4.5.4.

Mtodos para recuperar un elemento, sin eliminarlo

El mtodo get(int indice) retorna el elemento ubicado en la posicin que se indica. Elemento elemento= lista.get(2); Si el ndice est fuera de rango se lanza IndexOutOfBoundsException. El mtodo getFirst() retorna el primer elemento de la lista. Elemento elemento= lista.getFirst();

Ana Mara Clos

15

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Si la lista est vaca arroja NoSuchElement Exception. El mtodo getLast() retorna el ltimo elemento de la lista. Elemento elemento= lista.getFirst(); Si la lista est vaca arroja NoSuchElement Exception.

4.5.5.

Mtodo int indexOf(Object o)

Retorna el ndice de la primera posicin en que se encuentra el elemento. Si el elemento no se encuentra, retorna -1. Elemento elemento= lista.getFirst();

4.5.6.

Mtodos para eliminar elementos de la lista

El mtodo removeFirst() remueve y retorna el primer elemento de la lista. Elemento elemento= lista.removeFirst(); Si la lista est vaca arroja NoSuchElement Exception. El mtodo removeLast() remueve y retorna el ltimo elemento de la lista. Elemento elemento= lista.removeLast(); Si la lista est vaca arroja NoSuchElement Exception. El mtodo remove(int indice) remueve el elemento ubicado en la posicin indicada.

Ana Mara Clos

16

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Elemento elemento= lista.remove(2); Si el ndice est fuera de rango arroja NoSuchElementException. El mtodo remove(Object o) remueve el elemento de la lista y retorna true si la lista contiene el elemento. Para que este mtodo funcione debe sobrescribirse el mtodo equals de la clase Modelo que corresponde al elemento a eliminar. boolean ok=lista.remove(empleado);

4.5.7.

Mtodo Element set(int index, Elemento elemento)

Reemplaza el elemento en la posicin indicada con el elemento que se especifica. Retorna el elemento que fue reemplazado. Persona anterior=lista.set(0, new Persona(333,"ema")); Arroja IndexOutOfBoundsException.

4.5.8.

Mtodo int size()

Retorna la cantidad de elementos que hay en la lista. int cantidad=lista.size();

4.6 Listas ordenadas


Para construir una lista ordenada, extendemos la clase LinkedList con el parmetro genrico <Elemento> y escribimos el mtodo agregarOrdenado(). Esta clase hereda todos los mtodos de LinkedList; pero solamente debemos utilizarla para ordenar, sino los elementos se van a
Ana Mara Clos 17

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

agregar en forma impredecible. Para que los elementos puedan ordenarse genricamente, deben implementar la interfaz Comparable, como se ver despus. import java.util.LinkedList; public class ListaOrdenada <Elemento> extends LinkedList public void agregarOrdenado(Elemento elemento){ Comparable nuevo=(Comparable)elemento; if(this.isEmpty()) this.add(nuevo); else{ Comparable primero=(Comparable)this.getFirst(); Comparable ultimo=(Comparable)this.getLast(); if(nuevo.compareTo(primero)<=0) this.addFirst(nuevo); else if(nuevo.compareTo(ultimo)>=0) this.addLast(nuevo); else{ boolean ubicado=false; int i=0; while(i<this.size() && !ubicado){ Comparable actual= (Comparable) this.get(i); if(nuevo.compareTo(actual)<=0){ this.add(i, nuevo); ubicado=true; } i++; } } } } } {

Ana Mara Clos

18

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

Al querer ordenar los elementos de una lista, se presenta el problema de hacer una comparacin que sea genrica y que no dependa de cada implementacin. Para lograrlo, en la clase Modelo se escribe un mtodo que compare dos atributos que se desee. Por ejemplo, en la clase Persona, se escribe un mtodo para comparar los nombres. Para que sea genrico, la clase debe implementar la interfaz Comparable y el mtodo debe llamarse compareTo(). A continuacin se muestran los cambios en la clase Persona. El primer mtodo compara los nombres y el segundo, los dni. Debe escribirse un solo mtodo, segn el atributo que se desea comparar. El mtodo compareTo() retorna un valor numrico que es negativo si el objeto referenciado por this es anterior al objeto que se pasa como parmetro entre parntesis. Retorna un valor positivo si el objeto this es posterior al parmetro. Retorna 0 si ambos son iguales. public class Persona implements Comparable{ . . . . // atributos y mtodos como siempre public int compareTo(Object o) { Persona p=(Persona)o; int comp=this.nombre.compareTo(p.nombre); return this.nombre.compareTo(p.nombre); } public int compareTo(Object o){ Persona p=(Persona)o; if(this.dni<p.dni) return -1; else if(this.dni>p.dni) return 1; else return 0; }

Ana Mara Clos

19

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

4.7 Ejemplo del uso de una lista ordenada


public class PruebaListaOrdenada { public static void cargar(ListaOrdenada lista){ lista.agregarOrdenado(new Persona(111,"juan")); lista.agregarOrdenado(new Persona(333,"ana")); lista.agregarOrdenado(new Persona(222,"beto")); lista.agregarOrdenado(new Persona(444,"tomas")); lista.agregarOrdenado(new Persona(555,"carlos")); } public static void mostrar(ListaOrdenada lista){ System.out.println(lista); } public static void main(String[] args) { ListaOrdenada lista=new ListaOrdenada(); cargar(lista); mostrar(lista); } }

4.8 La clase Vector


Esta clase es muy utilizada como Modelo dentro de la Interfaz grfica de usuario. Se implementa con un array de objetos que puede modificar su tamao dinmicamente. Tiene mtodos muy similares a los de LInkedList, para agregar, eliminar y retornar elementos. No vamos a profundizar en ella, ya que su implementacin puede consultarse en la documentacin de Java.

4.9 Ejercicios
1. Construir un programa que permita, dada una lista de valores numricos, determinar cual es el mayor y cual es el menor, en un nico recorrido.

Ana Mara Clos

20

Instituto Superior de Formacin Tcnica 179 Unidad IV TADS

Programacin II

2. Dada una lista de nmeros, construir una funcin que determine el promedio de los mismos. 3. Guardar en una lista enlazada los coeficientes de un polinomio en forma descendente, segn el grado. Realizar una funcin que dada la lista de coeficientes y un cierto valor de x retorne el valor del polinomio. Recorrer la lista de atrs hacia delante. 4. Implementar un programa con un men que permita acceder a las siguientes funciones: agregar al principio, al final, eliminar, modificar y mostrar. 5. Realizar un programa lea los registros de un archivo secuencial, inserte los elementos en forma ordenada, los muestre, permita ingresar ms elementos en forma ordenada y al salir del programa almacene los datos en otro archivo secuencial.

Ana Mara Clos

21