Sie sind auf Seite 1von 76

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

MARZO / 2009
Todo lo que se necesita saber sobre: pilas ~ colas ~ arboles Todo esto implementado en cdigo java.

Capitulo I: Pila capitulo II: Cola capitulo III: Arbol Ejemplos aplicativos

Facultad de Ingeniera de Sistemas

ESTRUCTURA DE DATOS EN JAVA


Yerson Carhuallanqui Palian

1
Primera Edicion- no revisado Hecho con: Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los trminos de la Licencia Commons Creative

Pgina | 1 FlashLinuxLibre - 2009sin dudas revolucion el mundo, nos corresponde a nosotros colocarlo El Software en el puesto que se merece.

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

FlashLinux 2009

Estructura de Datos en java


Pilas ~ Colas ~ rboles

Yerson Carhuallanqui palian

FlashLinux - 2009

Pgina | 2

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

A mis padres: Cesar y Florencia, Las personas que con su ternura Y comprensin hizo de m, Una persona de bien.

A mis hermanas, Por llenarme de alegra y felicidad

FlashLinux - 2009

Pgina | 3

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Reconocimiento-Compartir bajo la misma licencia Usted es libre de: Copiar, distribuir y comunicar pblicamente la obra. Hacer obras derivadas.

Bajo las condiciones siguientes: Reconocimiento: Debe reconocer los crditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace su obra). Compartir bajo la misma licencia: Si altera o transforma esta obra, o genera una obra derivada solo puede distribuir la obra bajo una licencia idntica a sta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos del autor. Nada en esta licencia menoscaba o restringe los derechos morales del autor.

FlashLinux - 2009

Pgina | 4

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

CONTENIDO
CAPITULO I: PILAS 1. Pila 1.1. Operaciones bsica 1.2. Arquitectura bsica de una pila 1.3. Implementacin CAPITULO II: COLAS 2. Cola 2.1. Usos concretos de la cola 2.2. Operaciones bsica 2.3. Variables de instancia en la implementacin 2.4. Implementacin CAPITULO III: ARBOLES 3. Arbol 3.1. Nomenclatura de los rboles 3.2. rbol binario. 3.3. Convirtiendo a un rbol binario 3.4. Implementacin CAPITULO IV: EJEMPLOS 4.1. Ejemplos 1: Pila 4.2. Ejemplos 2: Cola 4.3. Ejemplos 3: Arboles

07

15

22

31

FlashLinux - 2009

Pgina | 5

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

P R E FA C I O
Dar el primer paso siempre es importante, pero tambin estoy seguro que igual o ms importantes an sern los pasos siguientes, porque stos reflejarn una continuidad en el compromiso adquirido en este mundo donde el principal objetivo debe ser brindar lo mejor de nosotros mismos. Quin lo iba a decir? Yo escribiendo mi propio manual?, Ahora todo es una realidad. Mucho se ha escrito acerca de que el aprendizaje no es accidental sino el resultado directo de esfuerzo y mucha dedicacin, muchos ven el aprendizaje como una actividad manejable, no por el estmulo, sino por el propio estudiante, quien debe querer aprender y participar en el proceso de aprendizaje, si es que quiere lograr un progreso real. Es importante que el estudiante reflexione acerca de lo anteriormente expuesto, cuando se encuentre en el proceso de aprendizaje de esta asignatura. Muchos jvenes leen libros y manuales acerca de esta asignatura, tal vez por el afn de entender mejor los temas tratados en clase, pero yo no fui uno de ellos. Yo intento plasmar todo lo aprendido en estas hojas. Para facilitar el proceso de aprendizaje en el mundo de la programacin, se ha preparado este material de apoyo, de fcil lectura, donde se han considerado puntos esenciales tales como: Los aspectos que deben ser aprendidos, la forma en que deben ser presentados y secuenciados, qu ideas deben ensearse antes que otras, la forma ms prctica de presentar cada concepto; todo esto para que el estudiante logre los objetivos propuestos en la asignatura. xito

FlashLinux - 2009

Pgina | 6

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

CAPITULO I: PILAS

Qu es Estructuras de Datos?
Las estructuras de datos son, como su nombre lo indica, estructuras que guardan datos. Pero no son solamente eso, ya que tambin tienen operaciones bsicas para acceder e insertar nuevos datos, lo que las hace eficientes y muy tiles al crear cierto tipo de programas.

Para entender claramente este captulo, primero tendremos que recordar lo que es Listas, ya que una pila es un tipo de Lista. Recordemos, entonces, lo que es una Lista: Una lista se define como una serie de N elementos E1, E2, ..., Ek, ordenados de manera consecutiva. Es decir, el elemento Ek (que se denomina elemento k-simo) es previo al elemento Ek+1. Si la lista contiene 0 elementos se denomina como lista vaca.

Las operaciones que se pueden realizar en la lista son: insertar un elemento en la posicin k, borrar el k- simo elemento, buscar un elemento dentro de la lista y preguntar si la lista est vaca. Etc.
FlashLinux - 2009
Pgina | 7

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

1. PILA Una pila (stack o pushdown en ingls) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir) que permite almacenar y recuperar datos. Las pilas son unas de las estructuras de datos ms usadas dentro de la programacin. En este caso se puede usar el famoso dicho: Los primeros sern los ltimos y los ltimos sern los primeros. Una pila es una lista de elementos en el que se cuenta con dos operaciones bsicas: apilar (push), que coloca un objeto en la pila, y su operacin inversa, retirar (o desapilar (pop), que retira el ltimo elemento apilado. En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto apilado (denominado cima). La operacin desapilar permite la obtencin de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser la nuevo cima.

Figura 1.1 En la figura 1.1, el elemento E ha sido el ltimo en ingresar a la pila. Si se quiere eliminar un elemento de la pila, ste debe ser el ltimo que ingres. O sea el ltimo en entrar es el primero en salir. Para explicar mejor el concepto de pilas, tomemos el siguiente caso: Supongamos que somos personas que nos apasiona leer libros (Ojo: solo estamos suponiendo), Si usted tiene un libro de Programacion en la mano y deseas ubicarlo en un lugar cualquiera, en este caso en tu escritorio, lo colocaras sin ningn problema. (Figura 1.2)

Programaci

Figura 1.2

FlashLinux - 2009

Pgina | 8

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ahora bien, ya tenemos ubicado nuestro primer libro. A continuacin ubicamos un segundo libro (estadstica) encima del primer libro; pues bien, este proceso de ubicar un libro encima del otro se llama apilar. Otro concepto que vamos a utilizar es la cima de la pila; es decir, el valor que esta al inicio de la pila, en el grafico siguiente la cima es el libro de estadstica y si apilamos un tercer libro la cima vendra ser este tercer libro. Veamos cmo va quedando nuestro grfico (Figura 1.3).

Estadstica Programaci

CIMA

Figura 1.3 Bueno con esto creo que se entiende mejor lo que est escrito lneas arriba: El ltimo que entra es el primero que sale, Claro que esto se cumple, pues usted va a poder retirar o desapilar el ltimo libro que apil. Y si por algn motivo deseas retirar el libro de programacin lo primero que tendrs que hacer es desapilar el libro de estadstica. Adems de esto usted solo puede apilar en la cima de la pila. Ahora podemos representar nuestros libros como una pila: Si lo llevamos el caso anterior a una pila, quedara de la siguiente manera (Figura1.4). El primer libro que apilamos es el libro de programacin, luego el segundo libro apilado fu de estadstica, aqu se puede observar claramente que la insercin de elementos en la pila se realiza por la cima o inicio, como ya lo habamos mencionado anteriormente.

Figura1.4 Para entender mejor, la figura anterior se puede visualizar de la siguiente manera:

Figura 1.5
FlashLinux - 2009
Pgina | 9

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

1.1.

OPERACIONES BSICAS

Las pilas proveen de las siguientes operaciones: apilar(x) desapilar() cima() anula() estaVacia() Inserta el elemento x en el tope o cima de la pila. Elimina el elemento que se encuentra en la cima de la pila. retorna el elemento que se encuentre en el tope o cima de la pila, pero sin eliminarlo de sta (top en ingls). Borra todos los elementos de la pila. Retorna verdadero si la pila no contiene elementos, falso en caso contrario.

Nota: Algunos autores definen desapilar como sacar el elemento del tope de la pila y retornarlo. 1.2. Arquitectura bsica de una pila Una pila tpica es un rea de la memoria de los computadores con un origen fijo y un tamao variable. Al principio, el tamao de la pila es cero. Un puntero de pila, por lo general en forma de un registro de hardware, apunta a la ms reciente localizacin en la pila; cuando la pila tiene un tamao de cero, el puntero de pila de puntos en el origen de la pila. Las dos operaciones aplicables a todas las pilas son:

Una operacin apilar, en el que un elemento de datos se coloca en el lugar apuntado por el puntero de pila, y la direccin en el puntero de pila se ajusta por el tamao de los datos de partida. Una operacin desapilar: un elemento de datos en la ubicacin actual apuntado por el puntero de pila es eliminado, y el puntero de pila se ajusta por el tamao de los datos de partida.

Hay muchas variaciones en el principio bsico de las operaciones de pila. Cada pila tiene un lugar fijo en la memoria en la que comienza. Como los datos se aadirn a la pila, el puntero de pila es desplazado para indicar el estado actual de la pila, que se expande lejos del origen (ya sea hacia arriba o hacia abajo, dependiendo de la aplicacin concreta).

1.3. IMPLEMENTACIN Para poder implementar nuestro programa, haremos uso de un software; en nuestro caso usaremos NetBeans IDE 6.0.

FlashLinux - 2009

Pgina | 10

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Tambin se puede utilizar otro software como JCreator que tambin nos permite implementar cdigo java, pero lo que realmente nos interesa es la implementacin del cdigo y no el software. Bueno lo que haremos ser crear la clase pila e implementar las operaciones bsica que realiza, como ya sabemos en una pila se puede insertar elementos al que nosotros lo llamamos apilar, podemos desapilar, obtener el valor de la cima, anular o borrar toda la pila, y saber si la pila est vaca o llena. Entonces ah vamos, espero que no se pierdan. EJEMPLO 01: Implementar un programa que almacene nmeros enteros positivos, el programa debe realizar las operaciones bsicas de una pila (anular, apilar, desapilar, mostrar la cima, verificar si la pila est vaca, mostrar el contenido). Ejemplo: si ingresamos los nmeros 1, 2, 3 y 4 debe quedar de la siguiente manera.

Figura 1.6 Implementacin de la clase pila:


import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { int nombre; // para el valor que va almacenar Nodo sgte; // apuntador al siguiente Nodo } Nodo inicio = null; Nodo fin = null; //elimina todo los elementos de la pila. public void anula() { inicio = fin = null; }

FlashLinux - 2009

Pgina | 11

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//Implementacion del metodo apilar que nos permite insertar un elemento en la pila, en este caso como se trata de una pila insertamos en el inicio o cima de la pila. public void apilar(int x) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.nombre = x; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; }

// Implementacion del metodo desapilar, que nos permite quitar un elemento de la pila, en este caso quitamos el elemento que esta en la cima public void desapilar() { if (inicio == null){ JOptionPane.showMessageDialog(null, "Pila vaca..."); } else { inicio = inicio.sgte; } } //Implementacion del metodo CIMA, que nos retorna el valor de la cima como un numero entero. public int cima() { if (inicio == null) { // si la pila esta vaca return (-1); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.nombre; } }

//Implementacion del metodo estaVacio. public boolean estaVacio() { if (inicio == null){ // si la pila est vacio retornar verdadero.
FlashLinux - 2009
Pgina | 12

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

return true; } else { // si no retornar falso. return false; } } //Implementacion del metodo contenido, que nos permite visualizar el contenido de la pila. public void contenido() { Nodo temp = inicio; String cad = "El contenido de la pila es:\n"; while (temp != null) { cad += temp.nombre + "\n "; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } }

Implementacin de la Clase PruebaPila que utiliza la clase pila:


import javax.swing.JOptionPane; public class PruebaPila { public static void main(String[] args){ pila p = new pila(); int nombre; //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= 4; i++) { nombre = Integer.parseInt(JOptionPane.showInputDialog( "Ingrese valor a apilar: ")); p.apilar(nombre); }

//Mostramos el contenido de la pila. p.contenido();


FlashLinux - 2009
Pgina | 13

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//Obtenemos el valor de la cima. JOptionPane.showMessageDialog(null, "La cima es: " + p.cima()); //Desapilamos un elemento de la pila, en este caso se desapila la cima. p.desapilar(); p.contenido(); // verificamos si la pila est vacio... JOptionPane.showMessageDialog(null, "La pila est vacio?: " + p.estaVacio()); //Utilizamos el metodo anula para eliminar todo el contenido de la pila. p.anula(); // otra vez verificamos si la pila est vacio (deberia retornar verdadero ya que el contenido de la pila fue eliminada) JOptionPane.showMessageDialog(null, "La pila est vacio?: " + p.estaVacio()); } }

FlashLinux - 2009

Pgina | 14

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

CAPITULO II: COLAS

COLAS
2. COLA El nombre ms comn de sta estructura de datos es cola aunque yo la preferira llamar fila por razones obvias. Esta estructura de datos funciona como una fila de turnos, al primero que llega se le atiende primero y al ltimo que llega se le atiende al ltimo. Tal y cmo en la taquilla del cine. De esta manera, al acceder a una cola, se accede al primer elemento que se introdujo, luego al segundo, luego al tercero y as sucesivamente.

Las colas se utilizan en sistemas informticos, transportes, operaciones de investigacin (entre otros), dnde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma
de listas enlazadas.

Tambin se conoce a las colas como listas FIFO (FIRST IN - FIRST OUT: el primero que entra es el primero que sale). Afortunadamente en un sistema informtico no se cuela nadie salvo que el programador lo diga. Esto se entiende de la siguiente manera: El primer elemento en entrar es el primero en salir. (Figura 2.1)

FlashLinux - 2009

Pgina | 15

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Figura 2.1 Para aclararlo, se muestran una serie de grficos explicativos, partiendo de un cola vaca, es decir, una cola nulo.

Cola vaca:

Se encola un 3.

Se encolan el 5 y el 7. Se obtiene una cola contenida.

Se desencola el 3; ahora se tiene una cola vaca.

Si se desencola se obtiene el 5.

2.1. Usos concretos de la cola La particularidad de una estructura de datos de cola es el hecho de que slo podemos acceder al primer y al ltimo elemento de la estructura. As mismo, los elementos slo se pueden eliminar por el principio y slo se pueden aadir por el final de la cola. Ejemplos de colas en la vida real seran: personas comprando en un supermercado, esperando para entrar a ver un partido de bisbol, esperando en el cine para ver una pelcula, una pequea peluquera, etc. La idea esencial es que son todas lneas de espera. En estos casos, el primer elemento de la lista realiza su funcin (pagar comida, pagar entrada para el partido o para el cine) y deja la cola. Este movimiento est representado en la cola por la funcin pop o desencolar.

FlashLinux - 2009

Pgina | 16

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Cada vez que otro elemento se aade a la lista de espera se aaden al final de la cola representando la funcin push o encolar. Hay otras funciones auxiliares para ver el tamao de la cola (size), para ver si est vaca en el caso de que no haya nadie esperando (empty) o para ver el primer elemento de la cola (frente). Para que este concepto quede claro a continuacin de presento un caso: Supogamos que somos cliente de un banco. Generalmente, cuando uno va a realizar cualquier operacin bancaria, nos encontramos a muchas personas esperando ser atendidas, stas personas esperan ordenadamente segn la orden de llegada de cada cliente; es decir, si un cliente lleg primero al banco ser el primero en ser atendida, mientras que los dems deben esperar su turno. Algo similar ocurre en la implementacin de colas, los elementos que se insertan se realizan al final de la cola, mientras que los elementos que se van a eliminar se realizan al inicio o al frente de dicha cola. Bueno sigamos con nuestro caso, supongamos que el cliente Cesar llega al banco, seguidamente llega el siguiente cliente Juan, si ordenamos segn la orden de llegada se observa la siguiente figura.

Figura 2.2

Si lo representamos en una cola, la figura sera el siguiente:

Figura 2.3

Qu pasa con la cola si llega el tercer cliente marcos? Donde se inserta el elemento?

FlashLinux - 2009

Pgina | 17

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Como ya mencionamos lneas arriba, en una cola los elementos se insertan al final, por lo que la cola quedara de la siguiente manera:

Figura 2.4

2.2. OPERACIONES BSICAS Las colas poseen las siguientes operaciones bsicas: encolar(x) desencolar() frente() anula() estaVacia() Inserta el elemento x al final de la cola Elimina el elemento que se encuentra al frente de la cola. retorna el elemento que se encuentre en el frente de la cola, pero sin eliminarlo de sta (top en ingls). Borra todos los elementos de la pila. Retorna verdadero si la pila no contiene elementos, falso en caso contrario.

2.3. VARIABLES DE INSTANCIA EN LA IMPLEMENTACIN Inicio: indica el ndice de la posicin del primer elemento de la cola, es decir, la posicin el elemento a retornar cuando se invoque sacar.

Fin: indica el ndice de la posicin de ltimo elemento de la cola. Si se invoca encolar, el elemento debe ser insertado en el casillero siguiente al que indica la variable.

2.4. IMPLEMENTACIN Ahora implementaremos la clase cola y sus principales operaciones que realiza: De la misma manera que realizamos la implementacion de pilas, ahora realizamos en colas. Como en el caso anterior, nuestra cola tambien almacenar numeros enteros.

FlashLinux - 2009

Pgina | 18

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

EJEMPLO 01: Implementacin de la clase cola:


//Implementacion y demostracion basica de Colas. import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { int nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //Implementacion del metodo anula, que limpia toda la cola. public void anula() { inicio = fin = null; } //metodo que inserta un elemento al final de la cola. public void encolar(int x) { Nodo temp = new Nodo(); // creamos un nuevo Nodo temporal. if (temp == null) { JOptionPane.showMessageDialog(null, "Error de asignacion..."); } else { temp.nombre = x; // Poner al final de la cola if (fin != null) { fin.sgte = temp; } fin = temp; temp.sgte = null; if (inicio == null){ inicio = fin; } } }
FlashLinux - 2009
Pgina | 19

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//metodo que elimina el valor que esta al frente. public void desencolar() { if (inicio == null) { JOptionPane.showMessageDialog(null, "Cola vaca..."); } else { // Quitar del principio de la cola inicio = inicio.sgte; } } // metodo que retorna el valor de la cola del frente. public int frente() { if (inicio == null) { // si la cola es vaca retorna -1 JOptionPane.showMessageDialog(null, "Cola vaca..."); return (-1); } else { // retorna el valor que esta al frente... return inicio.nombre; } } //metodo que nos permite verificar si la pila esta vacia o contenido public boolean estaVacio(){ if (inicio == null){ // si al pila se encuentra vacion retornar verdadero. return true; }else { return false; } }

//muestra el contenido de la cola public void contenido() { Nodo temp = inicio; String cad = "Impresin de la cola:\n"; while (temp != null) { cad += temp.nombre + " --> "; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } }

FlashLinux - 2009

Pgina | 20

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase PruebaCola, que utiliza la clase cola: import javax.swing.JOptionPane; public class PruebaCola { public static void main(String[] args) { Cola C = new Cola(); int nombre; //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= 4; i++) { nombre = Integer.parseInt(JOptionPane.showInputDialog( "Ingrese valor a encolar: ")); C.encolar(nombre); } //Mostramos el contenido de la pila. C.contenido(); //Obtenemos el valor de la cima. JOptionPane.showMessageDialog(null,"El valor que esta al frente es: " + C.frente()); //Desapilamos un elemento de la pila, en este caso se desapila la cima. C.desencolar(); C.contenido(); // verificamos si la pila est vacio... JOptionPane.showMessageDialog(null, "La cola est vacio?: " + C.estaVacio());

//Utilizamos el metodo anula para eliminar todo el contenido de la pila. C.anula(); // otra vez verificamos si la pila est vacio (deberia retornar verdadero ya que el contenido de la pila fue eliminada) JOptionPane.showMessageDialog(null, "Ahora, La cola est vacio?: " + C.estaVacio()); } }

FlashLinux - 2009

Pgina | 21

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

CAPITULO III: RBOLES

3. ARBOL Bueno, vamos avanzando: Un rbol es una estructura de datos jerrquica, en que cada elemento est unido a otro nmero finito de elementos u objetos llamados Nodos, es importante mencionar que en los rboles, al igual que en las listas, ningn elemento apunta a alguno de sus predecesores. ...Uno de los Nodos que conforman el rbol es conocido como raz. Adems se crea una relacin o parentesco entre los nodos dando lugar a trminos como padre, hijo, hermano, antecesor, sucesor, ancestro, etc. 1 Si lo que queremos el verlo de forma grfica, entonces podemos representarlo mediante grafos, que es la mas utilizada y que a su vez se puede entender mejor la estructura de un rbol.
Nodo Raz C E I F k G

A B D H

Figura 3.1 [GRAFO]

1 Estructura de datos en Java - Abraham Gamarra moreno pg. 107

FlashLinux - 2009

Pgina | 22

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

3.1.

Nomenclatura de los rboles Aqu va la nomenclatura de los rboles:

A un conjunto de rboles se le llama bosque. A cada elemento del rbol se le llama nodo. A cada apuntador entre dos nodos se le llama rama. Un nodo A es padre de nodo B descendiendo por una rama de A se puede llegar a B. Un nodo A es hijo de B si descendiendo por la rama de B se puede llegar a A. Una hoja es un nodo que no tiene hijos. Un nodo es raz si no tiene padres. Todos los nodos que son descendientes directos (hijos) de un mismo nodo (padre), son hermanos. Todo nodo que no es raz, ni terminal u hoja se conoce con el nombre de interior. Grado es el nmero de descendientes directos de un determinado nodo. Grado del rbol es el mximo grado de todos los nodos del rbol.

Para que desciendan de las nubes, vamos a explicarlo con un ejemplo: Tomemos el siguiente grafo como nuestro rbol y definamos la nomenclatura de dicho rbol.

Como ya sabemos, el elemento A es la raz del rbol. B es hijo de A, C es hijo de A, D es hijo de B, E es hijo de B, etc... B y C son hermanos, D y E son hermanos, K y H son hermanos, etc... A es padre de B y C, B es padre de D y E, etc... K, H, E, I, J y G son nodos terminales u Hojas. El grado del nodo B es 2. El grado del rbol es 3.

FlashLinux - 2009

Pgina | 23

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

3.2.

rbol binario. Es un conjunto finito de elementos que est vaco o divido en tres subconjuntos separados. El primer subconjunto contiene un elemento nico llamado raz del rbol. Los otros 2 subconjuntos son por s mismo rboles binarios y se les conoce como subrboles izquierdo y derecho del rbol original.

Nodo raz

Subarbol izquierdo

Subarbol Derecho

Figura 3.3. [Definicin de un rbol binario] Si lo representamos como un Nodo, el grfico sera de la siguiente manera:
Nodo raz

A
Izquierdo Derecho

B
Izquierda Derecho Izquierdo

C
Derecho

null

null

null

null

Figura 3.4. [rbol representado como un Nodo]

3.3.

Convirtiendo a un rbol binario Para implementar arboles en java y en cualquier otro lenguaje de programacin, es preferible que nuestro rbol tenga la estructura de un rbol binario, para la fcil manipulacin de los Nodos; ya que un rbol binario presenta solo dos subarboles(izquierda y derecha) a diferencia de los arboles generales que son mas complejos.

FlashLinux - 2009

Pgina | 24

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Los pasos que se deben aplicar para lograr la conversin del rbol general al rbol binario son los siguientes: Tomemos el arbol general de la figura 3.5 para convertirlo en un arbol binario.

Figura 3.5

Cuando hay una relacion de padre a hijo, debe enlazarse en forma vertical el nodo padre con el hijo que se encuentra ms a la izquierda. Adems de esto, debe eliminarse el vnculo de ese padre con el resto de sus hijos. Todo los Nodos que desciendan del nodo padre, es decir, los nodos hermanos deben enlazarse en forma horizontal.

Finalmente nuestro arbol general quedar de la siguiente manera:


A B E K F C G L O M P D H N I J

Figura 3.6

FlashLinux - 2009

Pgina | 25

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ahora debe rotarse el diagrama resultante, aproximadamente 45 grados haca la zquierda, y as se obtendr el rbol bnaro correspondiente.

Figura 3.7 [rbol binario luego de girar 45] 3.4. Recorridos de un rbol El recorrido de un rbol es algo fundamental en la rama de los algoritmos, seguramente el lector estar pensando en saltarse esta parte, porque Qu tanta ciencia puede tener recorrer un rbol? No basta con poner que recorra todos los nodos y ya?. Pues la verdad es que no, ya que algunos algoritmos de ordenamiento utilizan el recorrido en orden, mientras que para buscar soluciones eficientes se utiliza el recorrido en preorden y para otro tipo de algoritmos que requiere cierta liberacin de memoria es necesario el recorrido en postorden. 3.4.1. Recorrido en Orden (Inorden) Llamado tambin recorrido en orden simtrico; en este caso se visita primero el nodo izquierdo, luego el actual y finalmente el derecho, se implementara algo as como mtodo del rbol: Aqu encontramos una nueva instruccin, la cual es visitar, puede realizar la operacin que el usuario desee. 3.4.2. Recorrido en Preorden Se visita primero el nodo actual, luego el izquierdo y finalmente el derecho ste recorrido es muy importante, ya que tambin existe una versin suya en grafos, la cual es llamada bsqueda en profundidad, y su variante es llamada backtracking, con la cual se pueden solucionar la mayor parte de los problemas que se refieren a buscar una permutacin.
FlashLinux - 2009
Pgina | 26

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

3.4.3. Recorrido en Postorden Visita primero los nodos hijos y luego el actual. Es decir; Recorre primero el subrbol izquierdo, luego recorre el subrbol derecho. Para finalmente visitar la raz. ste recorrido es til cuando se necesitan ir borrando los nodos que se visitan, ya que garantiza que nunca quedarn nodos sueltos. OBSERVACIN: 2 Existe un mtodo "mecnico" para listar los nodos de un rbol en cada uno de los recorridos descritos. Es el siguiente: Empezando por la raz, y avanzando en sentido contrario a las agujas de un reloj, trazar una trayectoria que se mantenga lo ms cerca posible del rbol. Entonces: En Preorden un nodo se lista la primera vez que se pasa por l. El Inorden, una hoja se lista la primera vez que se pasa por ella y un nodo interior se lista la segunda vez que se pasa por l. En Postorden, un nodo se lista la ltima vez que se pasa por l.

Figura 3.8

Hasta aqu toda la teora, ahora veamos la implementacin en JAVA.

2 Tomado de: Estructura de datos en java Abraham Gamarra Moreno

FlashLinux - 2009

Pgina | 27

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

2.4. IMPLEMENTACIN Ahora implementaremos la clase NodoArbol, la clase arbol y sus principales operaciones que realiza. Como en todos los casos, nuestro arbol alamcenar numeros enteros.

EJEMPLO 01: Implementacin de la clase NodoArbol:


public class NodoArbol {

//para el tipo de dato que va a almacenar el arbol, en este caso almacenar numeros enteros. int nombre; //apuntadores para el subarbol izquierda y derecha. NodoArbol izquierda = null; NodoArbol derecha = null;
public NodoArbol(int nombre) { this.nombre = nombre; izquierda = null; derecha = null; }

//mtodo que nos permite crear un nuevo elemento e insertarlo en el arbol public void insertar_elemento(int nombre) { if (nombre < this.nombre) { if (izquierda == null) { izquierda = new NodoArbol(nombre); } else { izquierda.insertar_elemento(nombre); } }
if (nombre > this.nombre) { if (derecha == null) { derecha = new NodoArbol(nombre); } else { derecha.insertar_elemento(nombre); } } } }

FlashLinux - 2009

Pgina | 28

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase arbol:


public class arbol { NodoArbol raiz; public arbol() { raiz = null; } public void InsertarNodo(int nombre) { if (raiz == null) { raiz = new NodoArbol(nombre); } else { raiz.insertar_elemento(nombre); } } public String preorden() { String resultado = preorden(raiz); return resultado; } public String in_orden() { String resultado = inorden(raiz); return resultado; } public String post_orden() { String resultado = postorden(raiz); return resultado; }

//Recorrido en preOrden public String preorden(NodoArbol nodo) { String cadena = new String(); if (nodo != null) { cadena += " " + String.valueOf(nodo.nombre); cadena += preorden(nodo.izquierda); cadena += preorden(nodo.derecha); } else { cadena = ""; } return cadena; } //Recorrido en InOrden public String inorden(NodoArbol nodo) { String cadena = new String(); if (nodo != null) { cadena += preorden(nodo.izquierda); cadena += " " + String.valueOf(nodo.nombre);
FlashLinux - 2009
Pgina | 29

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

cadena += preorden(nodo.derecha); } else { cadena = ""; } return cadena; }

//Recorrido en PostOrden public String postorden(NodoArbol nodo) { String cadena = new String(); if (nodo != null) { cadena += preorden(nodo.izquierda); cadena += preorden(nodo.derecha); cadena += " " + String.valueOf(nodo.nombre); } else { cadena = ""; } return cadena; }
}

Implementacin de la clase Prueba_NodoArbol: Utiliza la clase arbol.


import javax.swing.JOptionPane; public class prueba_NodoArbol { public static void main(String args[]){

//Creamos un nuevo arbol, llamado a. arbol a=new arbol(); // Insertamos los Nodos en el arbol a a.InsertarNodo(5); a.InsertarNodo(0); a.InsertarNodo(12); a.InsertarNodo(3); //Mostramos las diferentes formas de recorrer un arbol y los imprimimos en pantalla JOptionPane.showMessageDialog(null,"\n"+a.preorden()); JOptionPane.showMessageDialog(null,"\n"+a.in_orden()); JOptionPane.showMessageDialog(null,"\n"+a.post_orden());
} }

FlashLinux - 2009

Pgina | 30

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

CAPITULO IV:
EJEMPLOS

EJEMPLO DE PROGRAMAS: PILAS

IMPORTANTE !: En en capitulo I observamos la implementacion en codigo java sobre PILAS; pues bien, ya sabemos las operaciones bsicas que realiza. Si ya sabemos las operaciones bsicas que realiza una pila y esto a su vez ya est implementado, en los ejemplos posteriores que vamos a realizar solo me centrar en implementar los mtodos que son necesarios para solucionar determinados ejercicios.

Que lindo...!, Pero deseo que me lo expliques mejor. Los mtodos tales como apilar, desapilar, cima, contenido, etc, que son propios de la clase pila, no los modificar en absoluto; A continuacion se puede observar la clase apilar tal como est implementado en el capitulo I:
public void apilar(int nombre) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.nombre = nombre; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; }

FlashLinux - 2009

Pgina | 31

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Todo el cdigo anterior lo reemplazar por el siguiente, y practicamente ser lo mismo. Si en caso sea necesario su modificacin, lo mencionar y realizar los cambios necesarios.
public void apilar(...){ // mtodo apilar, implementado... }

Ejemplo 01: Se tiene una pila que almacena nombres de unos amigos, se pide implementar un mtodo que invierta el contenido de esta pila. SOLUCION: Implementacion de la clase pila:
import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { String nombre; // cadena de texto que almacena los nombres. Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void apilar(String nombre) { // mtodo apilar, implementado... } public void desapilar() { // mtodo desapilar, implementado... } public String cima() { if (inicio == null) { // si la pila esta vaca retornar return (""); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.nombre; } }

FlashLinux - 2009

Pgina | 32

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//Implementacion del metodo contenido, que nos permite visualizar el contenido de la pila. public void contenido() { Nodo temp = inicio; String cad = "La lista de nombres es: "; while (temp != null) { cad += "\n- " + temp.nombre; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } public void invertirPila(){ Nodo temp = inicio; // creamos una pila temporal para almacenar la pila invertida... pila pilaInvertida = new pila(); while(temp!=null){ pilaInvertida.apilar(temp.nombre); temp=temp.sgte; } pilaInvertida.contenido(); } }

Implementacion de la clase pruebaInvertir:


import javax.swing.JOptionPane; public class PruebaInvertir { public static void main(String[ ] args) { pila p = new pila(); String nombre; //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= 4; i++) { nombre = JOptionPane.showInputDialog("Ingrese nombre: "); p.apilar(nombre); } //Mostramos el contenido de la pila. p.contenido(); //La pila invertida es: p.invertirPila(); } }
FlashLinux - 2009
Pgina | 33

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 02: Se tiene una pila que almacena numeros enteros positivos, se pide eliminar los "n" primeros elementos que fueron ingresados. Es decir, si los elementos ingresados fueron: 12, 8, 14, 9, 6, 5. cuando: n=3, (sabemos que los numero 5, 6 y 9 son los primeros elementos ingresados). Entonces el contenido de la pila ser: 12, 8, 14 SOLUCION: Implementacin de la clase pila:
import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { int nombre; // para el valor que va almacenar Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void apilar(int x) { // mtodo apilar, implementado... } public void desapilar() { // mtodo desapilar, implementado... } public int cima() { // mtodo cima, implementado... } //Implementacion del metodo contenido, que nos permite visualizar el contenido de la pila. public void contenido() { Nodo temp = inicio; String cad = "El contenido de la pila es:"; while (temp != null) { cad += "\n ==> " + temp.nombre; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); }

FlashLinux - 2009

Pgina | 34

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

public void eliminar(int n) { Nodo temp = inicio; pila tempPila = new pila(); // para almacenar el numero de elementos que contiene la pila. int cantidad = 0; while (temp != null) { tempPila.apilar(temp.nombre); // apila los elementos en tempPila... desapilar(); cantidad++; temp = temp.sgte; } for (int i = 1; i <= cantidad; i++) { if (i <= n) { tempPila.desapilar(); } else { apilar(tempPila.cima()); tempPila.desapilar(); } } } }

Implementacin de la clase PruebaEliminar:


import javax.swing.JOptionPane; public class PruebaEliminar{ public static void main(String[] args) { pila p = new pila(); int nombre; int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la pila?: ")); //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= cant; i++) { nombre = Integer.parseInt(JOptionPane.showInputDialog("Ingrese valor a apilar: ")); p.apilar(nombre); }

FlashLinux - 2009

Pgina | 35

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//Mostramos el contenido de la pila. p.contenido(); //mtodo que elimina los n primeros numeros ingresados.. int n = Integer.parseInt(JOptionPane.showInputDialog("cuantos numeros deseas eliminar?: ")); p.eliminar(n); //Despues de eliminar los n primeros valores ingresados, mostramos el nuevo contenido de la pila. p.contenido(); } }

FlashLinux - 2009

Pgina | 36

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 03: Se tiene un polinomio de la forma: f(x) = ax + c, Los valores de los coefecientes y exponentes se almacenan en una pila. se pide implementar un mtodo que halle la derivada de f(x).
b

SOLUCIN: Implementacin de la clase pila:


import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { int coefeciente; // para almacenar el coefeciente del polinomio int exponente; // para almacenar el exponente del polinomio Nodo sgte; } Nodo inicio = null; Nodo fin = null; //Implementacion del metodo apilar que nos permite insertar un elemento en la pila, en este caso como se trata de una pila insertamos en el inicio o cima de la pila. public void apilar(int coef, int expo) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.coefeciente = coef; temp.exponente = expo; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; } public void desapilar() { // mtodo desapilar, implementado... } public int cima_coefeciente() { if (inicio == null) { // si la pila esta vaca return (-100); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.coefeciente; } }
FlashLinux - 2009
Pgina | 37

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

public int cima_exponente() { if (inicio == null) { // si la pila esta vaca return (-100); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.exponente; } } //Implementacion del metodo contenido, que nos permite visualizar el contenido de la pila. public void contenido() { Nodo temp = inicio; String cad = "El polinomio es:\n"; while (temp != null) { cad += temp.coefeciente + " X^" + temp.exponente + " + "; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } // Implementacion del metodo derivar... public void derivar() { Nodo temp = inicio; // creamos un nuevo apuntador... // creamos una pila temporal para almacenar los valores del polinomio derivada pila tempPila = new pila(); while (temp != null) { tempPila.apilar(temp.coefeciente * temp.exponente, temp.exponente - 1); desapilar(); temp = temp.sgte; } // almacenamos en la pila actual los valores que ya hemos derivado... while (tempPila.cima_coefeciente() != -100) { //apilamos los valores del coefeciente y el exponente en la pila actual, al mismo tiempo que vamos desapilando.. apilar(tempPila.cima_coefeciente(), tempPila.cima_exponente()); tempPila.desapilar(); } } }

FlashLinux - 2009

Pgina | 38

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase pruebaDerivada:


import javax.swing.JOptionPane; public class PruebaDerivada { public static void main(String[ ] args) { pila p = new pila(); int exponente = 0; int coefeciente = 0; int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos valores desea almacenar en la pila?: ")); //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= cant; i++) { coefeciente = Integer.parseInt(JOptionPane.showInputDialog("Ingrese coefeciente: ")); exponente = Integer.parseInt(JOptionPane.showInputDialog("Ingrese exponente: ")); p.apilar(coefeciente, exponente); } //Mostramos el contenido de la pila. p.contenido(); // Hacemos uso del metodo "derivar".. p.derivar(); //Mostramos el nuevo contenido del polinomio, pero ahora ya esta derivado... contenido(); } }

FlashLinux - 2009

Pgina | 39

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 04: Se tiene un polinomio de la forma: f(x) = ax + c, Los valores de los coefecientes y exponentes se almacenan en una pila. se pide implementar un mtodo que halle la integral de f(x).
b

SOLUCIN: Implementacin de la clase pila:


import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { double coefeciente; // para almacenar el coefeciente del polinomio double exponente; // para almacenar el exponente del polinomio Nodo sgte; } Nodo inicio = null; Nodo fin = null; //Implementacion del metodo apilar que nos permite insertar un elemento en la pila, en este caso como se trata de una pila insertamos en el inicio o cima de la pila. public void apilar(double coef, double expo) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.coefeciente = coef; temp.exponente = expo; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; } public void desapilar() { // mtodo desapilar, implementado... } public double cima_coefeciente() { if (inicio == null) { // si la pila esta vaca return (-100); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.coefeciente; } }
FlashLinux - 2009
Pgina | 40

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

public double cima_exponente() { if (inicio == null) { // si la pila esta vaca return (-100); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.exponente; } } //Implementacion del metodo contenido, que nos permite visualizar el contenido de la pila. public void contenido() { Nodo temp = inicio; String cad = "El polinomio es:\n"; while (temp != null) { cad += temp.coefeciente + " X^" + temp.exponente + " + "; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } // Implementacion del metodo integrar... public void integrar() { Nodo temp = inicio; // creamos un nuevo apuntador... // creamos una pila temporal para almacenar los valores del polinomio integrado pila tempPila = new pila(); while (temp != null) { tempPila.apilar(temp.coefeciente / (temp.exponente + 1), temp.exponente + 1); desapilar(); temp = temp.sgte; } // almacenamos en la pila actual los valores que ya hemos integrado... while (tempPila.cima_coefeciente() != -100) { //apilamos los valores del coefeciente y el exponente en la pila actual, al mismo tiempo que vamos desapilando.. apilar(tempPila.cima_coefeciente(), tempPila.cima_exponente()); tempPila.desapilar(); } } }

FlashLinux - 2009

Pgina | 41

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementarcin de la clase PruebaIntegral: import javax.swing.JOptionPane; public class PruebaIntegral { public static void main(String[] args) { pila p = new pila(); double exponente = 0; double coefeciente = 0; int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos valores desea almacenar en la pila?: ")); //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= cant; i++) { coefeciente = Integer.parseInt(JOptionPane.showInputDialog("Ingrese coefeciente: ")); exponente = Integer.parseInt(JOptionPane.showInputDialog("Ingrese exponente: ")); p.apilar(coefeciente, exponente); } //Mostramos el contenido de la pila. p.contenido(); // Hacemos uso del metodo "integrar".. p.integrar(); //Mostramos el nuevo contenido del polinomio, pero ahora ya esta integrado contenido(); } }

FlashLinux - 2009

Pgina | 42

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 05: Se tiene una pila que almacena n valores enteros positivos. Se pide implementar un mtodo para reemplazar un elemento de la pila por un nuevo valor; ambos numeros deben ser ingresados por teclado. (Tomado de: Estructura de datos en java MG. Abraham Gamarra Moreno) Ejemplo: Si x = 7 ^ y = 12.
4 18 7 15 4 18 12 15

SOLUCIN: Implementacin de la clase pila:


import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { int nombre; // para el valor que va almacenar Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void apilar(int x) { // metodo apilar, implementado... } public void desapilar() { // metodo desapilar, implementado... } public int cima() { // metodo cima, implementado... } public void contenido() { // metodo contenido, implementado... }

FlashLinux - 2009

Pgina | 43

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//Implementacion del metodo reemplazar, que reemplaza el valor de x por y. public void reemplazar(int x, int y) { Nodo temp = inicio; pila tempPila = new pila(); //apila los valores a tempPila while (temp != null) { tempPila.apilar(temp.nombre); desapilar(); temp = temp.sgte; } //Devuelve los elementos de tempPila, pero reemplazando x por el valor de y. while (tempPila.cima() != -1) { if (tempPila.cima() == x) { apilar(y); } else { apilar(tempPila.cima()); } tempPila.desapilar(); } } }

Implementacin de la clase PruebaReemplazar:


import javax.swing.JOptionPane; public class PruebaReemplazar { public static void main(String[] args) { pila p = new pila(); int nombre; int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos valores desea almacenar en la pila?: ")); //Ingresamos los valores a la pila mediante el metodo apilar. for (int i = 1; i <= cant; i++) { nombre = Integer.parseInt(JOptionPane.showInputDialog("Ingrese " + i + " valor a apilar: ")); p.apilar(nombre); } //Mostramos el contenido de la pila. p.contenido(); int x = Integer.parseInt(JOptionPane.showInputDialog("Que numero desea reemplazar?: "));
FlashLinux - 2009
Pgina | 44

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

int y = Integer.parseInt(JOptionPane.showInputDialog("Por que valor desea reemplazarlo?: ")); //realizamos el reemplazo del valor de x por el nuevo valor que es y p.reemplazar(x, y); //Despues de realizar el reemplazo, mostramos el nuevo contenido de la pila p.contenido(); } }

FlashLinux - 2009

Pgina | 45

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 06: Decimos que una frase o un numero es capica si se lee igual de izquierda a derecha que de derecha a izquierda desdeando los espacios en blanco que haya. Por ejemplo, la frase: "dabale arroz a la zorra el abad" (de dudosas consecuencias) es capica. Se pide implementar un metodo, haciendo uso de pilas, para evaluar si un numero o una frase en capicua. SOLUCIN: Implementacin de la clase pila:
import javax.swing.JOptionPane; public class pila { // creacion de un Nodo. class Nodo { char nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //Implementacion del metodo apilar que nos permite insertar un elemento en la pila, en este caso apilamos un caracter. public void apilar(char x) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.nombre = x; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; } public void desapilar() { //metodo desapilar, implementado... } public char cima() { if (inicio != null) { // si la pila no se encuentra vacia retornar el ultimo caracter de la pila. return inicio.nombre; } else { // si esta vacia devolver '#' return '#'; } }

FlashLinux - 2009

Pgina | 46

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//implementacion del metodo evalua_expresion. public void capicua(String expresion) { pila tempPila = new pila(); pila tempPila2 = new pila(); int i = 0; boolean validame = true; char caracter = '\0'; //apilamos los valores, al mismo tiempo que vamos apilando a tempPila para luego comparar. while (expresion.length() > i && validame == true) { caracter = expresion.charAt(i); //chartAt(i): toma un caracter de la cadena en la posicion "i". //solo apilamos si el caracter no es el vacio... if (caracter != ' ') { //apilamos en las dos pilas, al mismo tiempo... apilar(caracter); tempPila.apilar(caracter); } i++; } //apilamos los caracteres en tempPila2, sabemos que se apilaran en forma inversa que la pila actual.. while (cima() != '#') { tempPila2.apilar(cima()); desapilar(); } //Una vez que ya tenemos tempPila y tempPila2, este ultimo inversa al primero, procedemos a comparar. while (tempPila.cima() != '#') { if (tempPila.cima() == tempPila2.cima()) { validame = true; tempPila.desapilar(); tempPila2.desapilar(); } else { validame = false; break; } }

//comprobar validame... y mostrar el mensaje. if (validame == true) { JOptionPane.showMessageDialog(null, "La expresion ingresado SI es capcua...");
FlashLinux - 2009
Pgina | 47

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

} else { JOptionPane.showMessageDialog(null, "La expresion ingresado NO es capcua... "); } } }

Implementacin de la clase PruebaCapicua:


import javax.swing.JOptionPane;

public class PruebaCapicua { public static void main(String[] args) { pila p = new pila(); //Ingrese expresion String nombre = JOptionPane.showInputDialog("Ingrese un numero o una palabra: "); //Utilizacion del metodo capicua, para evaluar si al expresion ingresada es un capicua o no. p.capicua(nombre); } }

FlashLinux - 2009

Pgina | 48

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 07: Programa que valida un expresion matematica mediante la utilizacion de PILAS, el programa te permite ingresar una expresion matematica cualquiera, por ejemplo: si ingresamos {(2+8) -[5*8]},puede ser validado como vedadero o faso. (Tomado de: Estructura de datos en java MG. Abraham Gamarra Moreno)

SOLUCIN: Implementacin de la clase pila:


import javax.swing.JOptionPane; public class pila { // creacion de un Nodo. class Nodo { char nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void anula() { inicio = fin = null; } //Implementacion del metodo apilar que nos permite insertar un elemento en la pila, en este caso como se trata de una pila insertamos en el inicio o cima de la pila. public void apilar(char x) { // creamos un Nodo temporal para almacenar el valor que vamos a insertar. Nodo temp = new Nodo(); temp.nombre = x; if (inicio == null) { fin = inicio; } temp.sgte = inicio; inicio = temp; } public void desapilar() { // metodo desapilar, implementado... } public char cima() { if (inicio != null) { // si la pila no se encuentra vacia retornar el ultimo caracter de la pila.
FlashLinux - 2009
Pgina | 49

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

return inicio.nombre; } else { // si esta vacia devolver '#' return '#'; } } //implementacion del metodo evalua_expresion. public void evalua_expresion(String expresion) { int i = 0; boolean validame = true; char caracter, caracter1, caracter2; //caracteres para parentesis, llaves,corchetes, etc... anula(); // Limpia toda la pila caracter = caracter1 = caracter2 = '\0'; while (expresion.length() > i && validame == true) { caracter = expresion.charAt(i); //chartAt(i): toma un caracter de la cadena en la posicion "i". if (caracter == '(' || caracter == '[' || caracter == '{') { // si el caracter es '(', '[' o '{' utilizamos el metodo apila para insertar el elemento en la PILA. apilar(caracter); } if (caracter == ')' || caracter == ']' || caracter == '}') { if (inicio == null) { validame = false; } else { switch (caracter) { case ')': caracter1 = '('; break; case ']': caracter1 = '['; break; case '}': caracter1 = '{'; break; } // caracter2 toma el ultimo valor de la Pila... caracter2 = cima(); desapilar(); // desapilamos la cima, es decir lo quitamos de la pila. if (caracter1 != caracter2) { validame = false; } } } i++; }
FlashLinux - 2009
Pgina | 50

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

// Si al final te queda algun caracter, ya sea un parentesis, un corchete o una llave, eso quiere decir que la expresion no es vlida. if (inicio != null) { validame = false; } //validame es igual que decir: validame=true if (validame == true) { JOptionPane.showMessageDialog(null, "La expresion es valida. "); } else { JOptionPane.showMessageDialog(null, "La expresion no es valida. "); } } }

Implementacin de la clase EvaluaExpresion:


import javax.swing.JOptionPane; public class EvaluaExpresion { public static void main(String[] args) { pila p = new pila(); //Ingresamos la expresion a evaluar... String nombre = JOptionPane.showInputDialog("Ingrese expresin: "); //Utilizacion del metodo evalua_expresion. p.evalua_expresion(nombre); } }

FlashLinux - 2009

Pgina | 51

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

EJEMPLO DE PROGRAMAS: COLAS


Ejemplo 08: Bueno ac les dejo un programita para calentar, es sencillo y hace uso de colas. Se tiene una cola que almacena numeros enteros positivos, relizar un metodo que nos muestre el doble de los nmeros almacenados en dicha cola. SOLUCIN: Implementacin de la clase Cola:
import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { int nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void encolar(int x) { //metodo encolar, implementado... } public void desencolar() { //metodo desencolar, implementado... } public int frente() { //metodo frente, implementado... } public void contenido() { //metodo contenido, implementado... } public void Doble() { //creamos una nueva Cola para almacenar los numeros duplicados... Cola tempCola = new Cola(); //almacenamos los elementos en tempCola... while (frente() != -1) { tempCola.encolar(frente()); desencolar(); }
FlashLinux - 2009
Pgina | 52

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//encolamos en la cola actual los valores de tempCola, pero multiplicado por 2.. while (tempCola.frente() != -1) { encolar(2 * tempCola.frente()); tempCola.desencolar(); } } }

Implementacin de la clase PruebaDoble:


import javax.swing.JOptionPane; public class PruebaDoble { public static void main(String[] args) { Cola c = new Cola(); //Declaramos las variables que va a almacenar la cola, en este caso almacenar numeros enteros. int n; //Ingresamos los valores a la cola mediante el metodo encolar. int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la cola?: ")); for (int i = 1; i <= cant; i++) { n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese " + i + " valor a encolar: ")); //encolamos el valor de n c.encolar(n); } //mostramos el contenido de la cola... c.contenido(); //utilizamos el metodo Doble... c.Doble(); //mostramos el nuevo contenido de la cola, pero esta vez nos mostrar el doble de los numeros... c.contenido(); } }

FlashLinux - 2009

Pgina | 53

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 09: Se tiene una cola que almacena numeros enteros positivos, se pide implementar un mtodo que nos pemita obtener el menor de los numeros almacenados en la cola. SOLUCIN: Implementacin de la clase Cola:
import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { int nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //metodo que inserta un elemento al final de la cola. public void encolar(int x) { //metodo encolar, implementado... } //metodo que elimina el valor que esta al frente. public void desencolar() { //metodo desencolar, implementado... } // metodo que retorna el valor de la cola del frente. public int frente() { //metodo frente, implementado... } //muestra el contenido de la cola public void contenido() { //metodo contenido, implementado... } //metodo para calcular el menor de los numeros.. public int calcularMenor() { Cola tempCola = new Cola(); int temp; //encolamos los elementos en una cola temporal... while (frente() != -1) { tempCola.encolar(frente()); desencolar(); }
FlashLinux - 2009
Pgina | 54

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//obtenemos el menor de los numeros de tempCola, al mismo tiempo que vamos devolviendo los elementos de la cola temporal... temp = tempCola.frente(); while (tempCola.frente() != -1) { if (tempCola.frente() < temp) { temp = tempCola.frente(); } encolar(tempCola.frente()); tempCola.desencolar(); } return temp; } }

Implementacin de la clase PruebaMenor:


import javax.swing.JOptionPane; public class PruebaMenor { public static void main(String[] args) { Cola c = new Cola(); //Declaramos las variables que va a almacenar la cola, en este caso almacenar numeros enteros. int n; //Ingresamos los valores a la cola mediante el metodo encolar. int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la cola?: ")); for (int i = 1; i <= cant; i++) { n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese " + i + " valor a encolar: ")); c.encolar(n); } //Mostramos el contenido de la cola. c.contenido(); //Obtener el menor valor de la cola... JOptionPane.showMessageDialog(null, "El menor valor de la cola es: " + c.calcularMenor()); } }

FlashLinux - 2009

Pgina | 55

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 10: Se tiene una cola que almacena numeros enteros positivos, utilizando el mtodo creado en el ejemplo anterior(mtodo que nos permite obtener el numero menor), implementar un metodo que nos permite ordenar los elementos de la cola de menor a mayor. SOLUCIN: Implementacin de la clase Cola:
import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { int nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //metodo que inserta un elemento al final de la cola. public void encolar(int x) { //metodo encolar, implementado... } //metodo que elimina el valor que esta al frente. public void desencolar() { //metodo desencolar, implementado... } // metodo que retorna el valor de la cola del frente. public int frente() { //metodo frente, implementado... } //muestra el contenido de la cola public void contenido() { //metodo contenido, implementado... } //metodo para calcular el menor de los numeros.. public int calcularMenor() { Cola tempCola = new Cola(); int temp; //encolamos los elementos en una cola temporal... while (frente() != -1) {
FlashLinux - 2009
Pgina | 56

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

tempCola.encolar(frente()); desencolar(); } //obtenemos el menor de los numeros de tempCola, al mismo tiempo que vamos devolviendo los elementos de la cola temporal... temp = tempCola.frente(); while (tempCola.frente() != -1) { if (tempCola.frente() < temp) { temp = tempCola.frente(); } encolar(tempCola.frente()); tempCola.desencolar(); } return temp; } //metodo que nos permite ordenar la cola en forma ascendente public void OrdenarCola() { Cola tempCola = new Cola(); int menor; //almacenamos los valores de la cola en una nueva cola temporal... while (frente() != -1) { tempCola.encolar(frente()); desencolar(); } while (tempCola.frente() != -1) { //obtenemos el menor valor de la cola temporal... menor=tempCola.calcularMenor(); // si el numero es igual al menor numero de la cola temporal, entonces encolamos en la cola actual if (tempCola.frente() == menor) { encolar(tempCola.frente()); } else {// de lo contrario encolamos en la misma cola temporal, sabemos que va ir desde el frente hasta el final de la cola temporal.... tempCola.encolar(tempCola.frente()); } //desencolamos... tempCola.desencolar(); } } }

FlashLinux - 2009

Pgina | 57

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase PruebaOrdenar:


import javax.swing.JOptionPane; public class PruebaOrdenar { public static void main(String[] args) { Cola c = new Cola(); //Declaramos las variables que va a almacenar la cola, en este caso almacenar numeros enteros. int n; //Ingresamos los valores a la cola mediante el metodo encolar. int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la cola?: ")); for (int i = 1; i <= cant; i++) { n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese " + i + " valor a encolar: ")); c.encolar(n); } //Mostramos el contenido de la cola. c.contenido(); //utilizamos el metodo ordenarCola para poder ordenar los numeros ascendentemente c.OrdenarCola(); //mostramos el nuevo contenido de la cola, pero esta vez nos mostrar ordenado... c.contenido(); } }

FlashLinux - 2009

Pgina | 58

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 11: Se tiene una cola que almacena enteros positivos y negativos. Se pide implementar una funcin que utilice esta cola y almacene los positivos en una pila y los negativos en otra pila. Luego desde las pilas desapile los elementos y almacene los elementos en otras dos colas. (Tomado de: Estructura de datos en java MG. Abraham Gamarra Moreno) En este ejemplo solo implementarmos los codigos en la clase PruebaPosiNega. SOLUCIN: Implementacin de la clase Pila:
import javax.swing.JOptionPane; public class pila { // creacion de la clase Nodo. class Nodo { int nombre; // para el valor que va almacenar Nodo sgte; } Nodo inicio = null; Nodo fin = null; public void apilar(int x) { // metodo apilar, implementado.... } public void desapilar() { // metodo desapilar, implementado.... } //retorna el valor de la cima como un numero entero. public int cima() { if (inicio == null) { // si la pila esta vaca return (-1000); } else { // si la pila no se encuentra vacia, retornar el valor de la cima. return inicio.nombre; } } public void contenido() { // metodo contenido, implementado.... }

FlashLinux - 2009

Pgina | 59

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase Cola:


import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { int nombre; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //metodo que inserta un elemento al final de la cola. public void encolar(int x) { //metodo encolar, implementado... } //metodo que elimina el valor que esta al frente. public void desencolar() { //metodo desencolar, implementado... } // metodo que retorna el valor de la cola del frente. public int frente() { if (inicio == null) { // si la cola es vaca retorna -1000 return (-1000); } else { // retorna el valor que esta al frente... return inicio.nombre; } } public void contenido() { // metodo contenido, implementado.... }

Implementacin de la clase PruebaPosiNega:


import javax.swing.JOptionPane; public class PruebaPosiNega { public static void main(String[] args) { Cola c = new Cola(); pila Pila_positivos = new pila(); pila Pila_negativos = new pila(); Cola Cola_positivos = new Cola();
FlashLinux - 2009
Pgina | 60

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Cola Cola_negativos = new Cola(); //Declaramos las variables que va a almacenar la cola, en este caso almacenar numeros enteros. int n; //Ingresamos los valores a la cola mediante el metodo encolar. int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la cola?: ")); for (int i = 1; i <= cant; i++) { n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese " + i + " valor a encolar: ")); //encolamos el valor de n c.encolar(n); } //mostramos el contenido de la cola... c.contenido(); //apilamos los numeros de la cola a las pilas... while (c.frente() != -1000) { if (c.frente() >= 0) { Pila_positivos.apilar(c.frente()); } else { Pila_negativos.apilar(c.frente()); } c.desencolar(); } //mostramos los contenidos de las pilas... Pila_positivos.contenido(); Pila_negativos.contenido(); //Llevamos los valores de la pila a la cola... //PARA LA PILA POSITIVO while (Pila_positivos.cima() != -1000) { Cola_positivos.encolar(Pila_positivos.cima()); Pila_positivos.desapilar(); } //PARA LA PILA NEGATIVO while (Pila_negativos.cima() != -1000) { Cola_negativos.encolar(Pila_negativos.cima()); Pila_negativos.desapilar(); } //mostramos los contenidos de las colas... Cola_positivos.contenido(); Cola_negativos.contenido(); } }
FlashLinux - 2009
Pgina | 61

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 12: Los datos de los competidores de una carrera automovilistica son almacenados en una cola, asi como tambien el resultado final de la carrera, los datos que se almacenan son: el nombre del piloto, y el tiempo de recorrido (en minutos). Se pide implementar una funcin que calcule el promedio de tiempo de carrera. Adems de ello modificar la cola para que nos muestre los nombres de los pilotos y la diferencia de tiempo (estos deben quedar ordenamos de acuerdo a la diferencia de tiempo con el menor tiempo de recorrido). SOLUCIN: Implementacin de la clase Cola:
import javax.swing.JOptionPane; public class Cola { //Creacion de la clase Nodo class Nodo { String piloto; double tiempo; Nodo sgte; } Nodo inicio = null; Nodo fin = null; //metodo que inserta un elemento al final de la cola. public void encolar(int x) { //metodo encolar, implementado... } //metodo que elimina el valor que esta al frente. public void desencolar() { //metodo desencolar, implementado... } // metodo que retorna el valor de la cola del frente: piloto. public String frente_piloto() { if (inicio == null) { // si la cola es vaca retorna -1 return (""); } else { // retorna el valor que esta al frente... return inicio.piloto; } } // metodo que retorna el valor de la cola del frente: tiempo. public double frente_tiempo() { if (inicio == null) { // si la cola es vaca retorna -1 return (-1);
FlashLinux - 2009
Pgina | 62

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

} else { // retorna el valor que esta al frente... return inicio.tiempo; } } //muestra el contenido de la cola public void contenido() { Nodo temp = inicio; String cad = "Impresin de la cola:\n"; while (temp != null) { cad += temp.piloto + " // " + temp.tiempo + " ==> "; temp = temp.sgte; } JOptionPane.showMessageDialog(null, cad); } //metodo para calcular el menor de los numeros.. public double calcularMenor() { Cola tempCola = new Cola(); double temp; //encolamos los elementos en una cola temporal... while (frente_tiempo() != -1) { tempCola.encolar(frente_piloto(), frente_tiempo()); desencolar(); } //obtenemos el menor de los numeros de tempCola, al mismo tiempo que vamos devolviendo los elementos de la cola temporal... temp = tempCola.frente_tiempo(); while (tempCola.frente_tiempo() != -1) { if (tempCola.frente_tiempo() < temp) { temp = tempCola.frente_tiempo(); } encolar(tempCola.frente_piloto(), tempCola.frente_tiempo()); tempCola.desencolar(); } return temp; } //metodo que calcular el promedio de tiempo... public double promedio() { Cola tempCola = new Cola(); double acumulador = 0; //para acumular el tiempo double cantidad = 0;//para obtener la contidad de elementos que contiene la cola...

FlashLinux - 2009

Pgina | 63

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

//encolamos los elementos en una cola temporal... while (frente_tiempo() != -1) { tempCola.encolar(frente_piloto(), frente_tiempo()); desencolar(); } //obtenemos el menor de los numeros de tempCola, al mismo tiempo que vamos devolviendo los elementos de la cola temporal... while (tempCola.frente_tiempo() != -1) { encolar(tempCola.frente_piloto(), tempCola.frente_tiempo()); //sumamos el tiempo, ademas agregamos el contador para obtener la cantidad de elementos de la cola... acumulador += tempCola.frente_tiempo(); cantidad++; tempCola.desencolar(); } return acumulador / cantidad; } //metodo que nos permite almacenar en una nueva cola los pilotos y la diferencia de tiempo.. public void OrdenarDT() { Cola tempCola = new Cola(); double tm = calcularMenor(); //menor tiempo double temp; //almacenamos los valores de la cola en una nueva cola temporal... while (frente_tiempo() != -1) { tempCola.encolar(frente_piloto(), frente_tiempo() - tm); desencolar(); } while (tempCola.frente_tiempo() != -1) { //obtenemos el menor tiempo de la cola temporal y lo almacenamos en la variable temp temp = tempCola.calcularMenor(); // si el tiempo es igual al menor tiempo de la cola temporal, entonces encolamos en la cola actual... if (tempCola.frente_tiempo() == temp) { encolar(tempCola.frente_piloto(), tempCola.frente_tiempo()); } else {// de lo contrario encolamos en la misma cola temporal, sabemos que va ir desde el frente hasta el final de la cola.... tempCola.encolar(tempCola.frente_piloto(), tempCola.frente_tiempo()); } //desencolamos... tempCola.desencolar(); } } }
FlashLinux - 2009
Pgina | 64

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase PruebaCarrera:


import javax.swing.JOptionPane; public class PruebaCarrera { public static void main(String[] args) { Cola c = new Cola(); //Declaramos las variables que va a almacenar la cola, en este caso almacenar el nombre del piloto y el tiempo de carrera. String piloto; double tiempo; //Ingresamos los valores a la cola mediante el metodo encolar. int cant = Integer.parseInt(JOptionPane.showInputDialog("cuantos elementos desea almacenar en la cola?: ")); for (int i = 1; i <= cant; i++) { piloto = JOptionPane.showInputDialog("Ingrese nombre del " + i + " piloto a encolar: "); tiempo = Double.parseDouble(JOptionPane.showInputDialog("Ingrese " + i + " tiempo a encolar: ")); //procedemos a encolar: piloto y tiempo c.encolar(piloto, tiempo); } //Mostramos el contenido de la cola. c.contenido(); //Obtener el menor valor de la cola... JOptionPane.showMessageDialog(null, "El menor valor de la cola es: " + c.calcularMenor()); //Obtener el promedio de la cola... JOptionPane.showMessageDialog(null, "El promedio es: " + c.promedio()); //utilizacion del mtodo que nos permite ordenar de acuerdo a la diferencia de tiempo... c.OrdenarDT(); //mostramos el contenido de la cola, pero esta vez nos mostrar ordenado... c.contenido(); } }

FlashLinux - 2009

Pgina | 65

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

EJEMPLO DE PROGRAMAS: ARBOL


Ejemplo 13: Se tiene un arbol que alamcena numeros enteros, se piede implementar una funcin que nos permita buscar un numero cualquiera en el arbol. El numero que se desea buscar debe ser ingresado por teclado. SOLUCIN: Implementacin de la clase NodoArbol:
public class NodoArbol {

//para el tipo de dato que va a almacenar el arbol, en este caso almacenar numeros enteros. int nombre; //apuntadores para el subarbol izquierda y derecha. NodoArbol izquierda = null; NodoArbol derecha = null;
public NodoArbol(int nombre) { this.nombre = nombre; izquierda = null; derecha = null; }

//mtodo que nos permite crear un nuevo elemento e insertarlo en el arbol public void insertar_elemento(int nombre) { if (nombre < this.nombre) { if (izquierda == null) { izquierda = new NodoArbol(nombre); } else { izquierda.insertar_elemento(nombre); } }
if (nombre > this.nombre) { if (derecha == null) { derecha = new NodoArbol(nombre); } else { derecha.insertar_elemento(nombre); } } } }

FlashLinux - 2009

Pgina | 66

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Implementacin de la clase arbol:


public class arbol { NodoArbol raiz; public arbol() { raiz = null; } public void insertar_nodo(int nombre) { if (raiz == null) { raiz = new NodoArbol(nombre); } else { raiz.InsertarElemento(nombre); } } //Para mostrar el contenido del arbol utilizaremos el recorrido en preorden. public String preorden() { String resultado = preorden(raiz); return resultado; } public String preorden(NodoArbol nodo) { String cadena = new String(); if (nodo != null) { cadena += " " + String.valueOf(nodo.nombre); cadena += preorden(nodo.izquierda); cadena += preorden(nodo.derecha); } else { cadena = ""; } return cadena; } //Busca un elemento en el arbol public int buscar(int temp) { int x = 0; if (temp < raiz.nombre) { raiz = raiz.izquierda; x = buscar(temp); } if (temp > raiz.nombre) { raiz = raiz.derecha; x = buscar(temp); }
FlashLinux - 2009
Pgina | 67

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

if (temp == raiz.nombre) { x = raiz.nombre; } return x; } }

Implementacin de la clase prueba_NodoArbol:


import javax.swing.JOptionPane; public class prueba_NodoArbol { public static void main(String args[]){ //creamos un nuevo arbol.... arbol a=new arbol(); //Insertamos Nodos en el arbol... a.insertar_nodo(5); a.insertar_nodo(0); a.insertar_nodo(12); a.insertar_nodo(3); //mostramos el contenido del arbol en PreOrden. JOptionPane.showMessageDialog(null, a.preorden()); //Ingresamos el numero que deseamos buscar en el arbol.. int n = Integer.parseInt(JOptionPane.showInputDialog("Ingrese nmero a buscar: ")); //utilizamos el metodo buscar para poder realizar la busqueda en el arbol. JOptionPane.showMessageDialog(null,"El dato que se busco es: " + a.buscar(n)); } }

FlashLinux - 2009

Pgina | 68

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Ejemplo 14: La idea de crear un sistema experto proviene de la intencin de emular el conocimiento humano. Para ello se intenta introducir en un sistema el conocimiento de un experto humano en un rea determinada. Estos sistemas trabajan con inteligencia artificial simblica, es decir, a nivel de smbolos; como pueden ser ideas, imgenes, conceptos, etc. El sistema experto ms sencillo se trata de un rbol de decisiones cuyas hojas finales son el resultado a nuestro problema. En el siguiente grfico se muestra una estructura en arboles de un sistema experto realmente sencillo, se pide implementar una funcion que nos permita emular este sistema experto haciendo uso de arboles.

SOLUCIN: Implementacin de la clase NodoArbol:


public class NodoArbol {

//para el tipo de dato que va a almacenar el arbol, en este caso almacenar numeros enteros. int nombre; //apuntadores para el subarbol izquierda y derecha. NodoArbol izquierda = null; NodoArbol derecha = null;
FlashLinux - 2009
Pgina | 69

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

public NodoArbol(int nombre) { this.nombre = nombre; izquierda = null; derecha = null; }

//mtodo que nos permite crear un nuevo elemento e insertarlo en el arbol public void insertar_elemento(int nombre) { if (nombre < this.nombre) { if (izquierda == null) { izquierda = new NodoArbol(nombre); } else { izquierda.insertar_elemento(nombre); } }
if (nombre > this.nombre) { if (derecha == null) { derecha = new NodoArbol(nombre); } else { derecha.insertar_elemento(nombre); } } } }

Implementacin de la clase arbol:


import javax.swing.JOptionPane; public class arbol { NodoArbol raiz; public arbol() { raiz = null; } //metodo que nos permite insertar un Nodo en al arbol. public void insertar_nodo(int nombre, String preg) { if (raiz == null) { raiz = new NodoArbol(nombre, preg); } else { raiz.insertar_elemento(nombre, preg); } } //para realizar la operacin, en este caso, utilizamos el recorrido en preorden, ustedes pueden utilizar cualquier tipo de recorrido.
FlashLinux - 2009
Pgina | 70

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

public String realizar_operacion() { String resultado = preorden(raiz); return resultado; } private String preorden(NodoArbol nodo) { String cadena = new String(); String eligeme = ""; if (nodo != null) { //realizamos la pregunta, si y solo si, exista un subarbol izquierdo y/o derecho. if (nodo.derecha != null || nodo.izquierda != null) { eligeme = JOptionPane.showInputDialog(nodo.pregunta + "\nIngrese: si / no"); } //si la respuesta ingresada es "NO", entonces recorrer el suarbol derecho. if (eligeme.compareTo("no") == 0) { cadena = preorden(nodo.derecha); } //si la respuesta ingresada es "SI", entonces recorrer el suarbol izquierdo. else if (eligeme.compareTo("si") == 0) { cadena = preorden(nodo.izquierda); } else { //caso contrario mostrar la respuesta final... cadena = "Entonces es un: " + nodo.pregunta; } } else { cadena = ""; } return cadena; } }

Implementacin de la clase PruebaAnimales:


import javax.swing.*; public class PruebaAnimales { public static void main(String args[]) { arbol a = new arbol(); //insertamos los Nodos en el arbol.. a.insertar_nodo(4, "Puede Volar?"); a.insertar_nodo(2, "Es un mamifero?"); a.insertar_nodo(1, "MURCIELAGO"); a.insertar_nodo(3, "CUERVO"); a.insertar_nodo(8, "Tiene cuernos?");
FlashLinux - 2009
Pgina | 71

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

a.insertar_nodo(6, "Tiene Joroba?"); a.insertar_nodo(5, "CAMELLO"); a.insertar_nodo(7, "BABUINO"); a.insertar_nodo(9, "CIERVO"); JOptionPane.showMessageDialog(null, "\n" + a.realizar_operacion()); } }

FlashLinux - 2009

Pgina | 72

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

BIBLIOGRAFA

Algoritmo y estrucutura de datos I - MG. Abraham Etseban Gamarra Moreno

Wikipedia Enciclopedia Libre: PILAS EN JAVA

http://es.wikipedia.org/wiki/Pila_(estructura_de_datos) COLAS EN JAVA

http://es.wikipedia.org/wiki/Cola_(estructura_de_datos) COLA DE PRIORIDADES

http://es.wikipedia.org/wiki/Cola_de_prioridades_(estructura_de_datos) ARBOL B

http://es.wikipedia.org/wiki/B-tree ARBOL BINARIO EN JAVA

http://es.wikipedia.org/wiki/%C3%81rbol_binario

Programacin en castellano: PILAS Y COLAS

http://www.programacion.com/tutorial/jap_data_alg/5/

FlashLinux - 2009

Pgina | 73

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

NOTA IMPORTANTE:

Todas las notas, casos ycomentarios expresados en el presente manualsonpropiasdesuautor.

Loscontenidosqueseofrecen han sidorecopilados de diferentes fuentes de informacin, algunos cdigos que se muestran en este manual fueron desarrollados en clase, por el docente Abraham Gamarra Moreno, periodo (2008-II)

El autor noseresponsabilizaporlosdaosoprdidade Informacinquellevelarealizacinde estasinstrucciones.

FlashLinux - 2009

Pgina | 74

Edited by Foxit Reader Copyright(C) by Foxit Software Company,2005-2008 For Evaluation Only. ESTRUCTURA DE DATOS EN JAVA Facultad de Ingeniera de Sistemas

COPYLEFT

Marzo 2009 ____________________________________________________ Dudas, sugerencias y/o comentarios: snyder.HM6@gmail.com mayer_kinder12@hotmail.com

Se los agradecer... ____________________________________________________

FlashLinux - 2009

Pgina | 75

ESTRUCTURA DE DATOS EN JAVA

Facultad de Ingeniera de Sistemas

Libres para pensar; Libres para decidir; Libres para crear...

FlashLinux - 2009

Pgina | 76

Das könnte Ihnen auch gefallen