Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructuras de Datos en Lenguaje Java
Estructuras de Datos en Lenguaje Java
Facultad de Ingeniera
Departamento de Ingeniera Industrial
Estructuras de Datos
Abstractas en Lenguaje
Java
Listas Enlazadas, Colas, Pilas y rboles Binarios
ndice
Consideraciones previas .................................................................................. 3
1. Almacenamiento de datos ............................................................................ 4
1.1 El problema de los arreglos ......................................................................... 4
1.2 Una solucin: la Lista Enlazada y las
estructuras de datos en base a punteros ....................................................... 5
3. Pila ..................................................................................................................... 16
3.1 Qu es una pila .............................................................................................16
3.2 Diseo de la clase Pila ..................................................................................17
3.2.1 Mtodo verPrimero() .....................................................................................17
3.2.2 Mtodo sacar() .............................................................................................. 18
3.2.3 Mtodo apilar() ............................................................................................. 18
3.2.4 Desafos para el alumno ............................................................................... 20
4. Cola ................................................................................................................... 21
4.1 Qu es una cola ............................................................................................ 21
4.2 Diseo de la clase Cola ................................................................................ 22
4.2.1 Mtodo enfilar() ............................................................................................ 22
4.2.2 Mtodo sacar() ............................................................................................. 23
4.2.3 Desafos para el alumno ............................................................................... 24
Consideraciones previas
1) Sobre la estructura de programacin usada.
La forma en que se muestran las estructuras de datos Lista Enlazada, Cola y Pila es slo
una manera alternativa de implementacin. La idea de este tutorial es complementar los
ejemplos de implementacin propuestos en el laboratorio y ctedra, para que el alumno se
de cuenta que puede disear estas estructuras de la manera que estime ms conveniente o
que ms se ajuste al problema a solucionar, mientras entienda el concepto fundamental de
la implementacin de ellas.
1. Almacenamiento de datos
1.1 El problema de los arreglos
Los arreglos y las estructuras de datos (listas, colas, pilas, etc.) son entes informticos
abstractos que nos permiten almacenar datos, es decir, en un lenguaje de programacin
como Java, objetos y/o tipos primitivos (int, double, char, boolean, etc...).
Los arreglos son, probablemente, la estructura ms usada para almacenar y ordenar datos
dentro de la programacin, debido a que la sintaxis para acceder a sus datos es muy
amigable para el programador. Por ejemplo, si tenemos un arreglo de ints, y queremos
sumar el segundo nmero de un arreglo con el cuarto, simplemente usamos la notacin [ ]
para acceder a ellos:
O, por ejemplo, si queremos llenar un arreglo con todas las letras minsculas, desde la a la
z, simplemente hacemos:
(*)
(*) ver Conversin por cast, capitulo 4, pgina 100
En este apunte, abarcaremos tres de estas estructuras: Lista Enlazada Simple, Cola y Pila.
stas dos ltimas se basan en la idea de la Lista Enlazada, as que las dejaremos para el
final.
Y podramos representar a una lista enlazada que almacena ints por medio del siguiente
diagrama:
La lista tambin tendr un atributo largo, del tipo long (o int, si se quiere), que
representar la cantidad de elementos en ella.
Nota: Para poder continuar, vea detalles sobre los atributos y el mtodo constructor en los
comentarios del archivo Cliente.java
Ahora tenemos todo para empezar a construir nuestra clase ListaEnlazada. En esta
implementacin de lista enlazada, definiremos los siguientes mtodos:
10
VALOR DE
TIPOS DE
RETORNO ARGUMENTO
boolean
Ninguno
estaVacia()
void
Ninguno
long
Ninguno
boolean
String
boolean
Nodo
void
String
Cliente
String
void
String
vaciar()
largo()
tieneElRut(rut)
tengaMasElementos(puntero)
aadir(nuevoCliente)
buscar(rut)
remover(rut)
UTILIDAD
Retorna true si la lista est
vaca, sino, false
Remueve todo el contenido de
la lista
Retorna el largo (numero de
elementos) de la lista
Retorna true si la lista tiene el
rut especificado, sino, false
Retorna true si puntero tiene
sucesor, sino, false
Aade a nuevoCliente al final
de la lista
Retorna el Cliente con el rut
especificado
Remueve al Cliente con el rut
especificado. Devuelve true si
elimina a alguno, sino, false
Luego conectamos a nuevoNodo con el ltimo nodo de la lista. Para referirnos a ste,
creamos un puntero, al que llamaremos puntero, al primer nodo y avanzamos hasta el
ltimo por medio de la instruccin puntero = puntero.siguiente como fue explicado
anteriormente.
11
Ahora que puntero apunta al ltimo nodo de la lista, y, adems, ahora puntero.siguiente
tiene un valor igual a null, haremos que puntero.siguiente tome el valor nuevoNodo, es
decir, puntero.siguiente = nuevoNodo . Grficamente:
12
Grficamente:
13
14
Un mtodo filtrador que reciba como argumento un valor booleano y que retorne
una lista filtrada. La idea es que, cuando el argumento sea true, devuelva una lista
slo con los clientes frecuentes de la lista original, es decir, clientes que tengan su
atributo esClienteFrecuente con valor true, y que cuando sea false, devuelva una
lista con slo los clientes no frecuentes.
Un mtodo filtrador que reciba como argumento un char y que retorne una lista
con todos los clientes que tengan apellido que empiece con esa letra, es decir, que
la primera letra de apellido sea la especificada en el argumento.
Una lista enlazada que guarde objetos de cualquier tipo. Entonces, para poder
diferenciarlos, hacer que cada nodo tenga un ndice (algo parecido a un arreglo), y
crear un mtodo para sta lista que retorne el objeto n-simo de la lista, dado el
valor de n.
15
3. Pila
3.1 Qu es una pila
La Pila o Stack es una estructura de datos muy simple. Imagina que tienes una pistola de
juguete que dispara pelotas, y, para cargarla, tienes que introducir las pelotas una a una por
la parte frontal del can de la pistola, una tras otra. La primera pelota que disparars ser
la ltima que introdujiste, y la ltima que disparars ser la primera que introdujiste. Eso
es una pila.
Otro ejemplo muy comn es la pila de platos que formas para lavarlos: el ltimo plato que
apilaste ser el primero que lavars.
La pila es una estructura que se basa en el concepto LIFO: Last In First Out, es decir, el
ltimo elemento que entra es el primero que sale.
La implementacin de una pila es muy parecida a la de lista enlazada, y slo difiere en la
forma que gestionamos los elementos almacenados. En una pila, crearemos mtodos que
cumplan las funciones expuestas anteriormente y aclaradas con la Fig. 3.1.1, es decir, un
mtodo que agregue un nodo al principio de la pila y otro que elimine el primer nodo de la
pila. Para esta implementacin, los nodos sern instancias de la clase Nodo, definida de la
misma forma que la definimos para la lista enlazada. Para poder continuar, es necesario
que revises detalladamente la definicin de esta clase. La explicacin de su
funcionamiento fue agregada en el mismo cdigo en forma de comentario.
16
VALOR DE
TIPOS DE
RETORNO ARGUMENTO
boolean
Ninguno
estaVacia()
void
Ninguno
long
Ninguno
Object
Ninguno
void
Ninguno
Object
Ninguno
void
Object
vaciar()
largo()
verPrimero()
sacar()
sacarYverPrimero ()
apilar(nuevoObjeto)
UTILIDAD
Retorna true si la pila est
vaca, sino, false
Remueve todo el contenido de
la pila
Retorna el largo (numero de
elementos) de la pila
Retorna el valor del contenido
de primeroDeLaPila
Elimina al primer nodo de la
pila
Elimina al primer nodo de la
pila, pero lo retorna
Aade un nodo que contiene a
nuevoObjeto a la pila,
empujando al resto de los
nodos
17
18
19
20
4. Cola
4.1 Qu es una cola
La Cola o Queue es otra de las estructuras de datos que revisaremos en este apunte. Como
las pilas, las colas son muy simples de entender e implementar. La idea de la cola es
simular el funcionamiento de una cola de la vida real, por ejemplo, la cola de un banco.
Imagina que tienes una pistola de juguete parecida a la del ejemplo de pila, pero ahora,
para cargarla, debes introducir las pelotas por la parte trasera del can. Eso es una Cola.
La cola es una estructura que se basa en el concepto FIFO: First In First Out, es decir, el
primer elemento que entra es el primero que sale.
Tal como las pilas, la implementacin de la pila es muy parecida a la de lista enlazada, y
slo difiere en la forma que gestionamos los elementos almacenados. En una cola,
crearemos mtodos que cumplan las funciones expuestas anteriormente y aclaradas con la
Fig. 4.1.1, es decir, un mtodo que agregue un nodo al principio de la cola y otro que
elimine el ltimo nodo de sta. Para esta implementacin, los nodos sern instancias de la
clase Nodo, definida anteriormente en el archivo Nodo.java. Para poder continuar, es
necesario que revises detalladamente la definicin de esta clase. La explicacin de su
funcionamiento fue agregada en el mismo cdigo en forma de comentario.
21
VALOR DE
RETORNO
boolean
TIPOS DE
ARGUMENTO
Ninguno
void
Ninguno
long
Ninguno
Object
Ninguno
Object
Ninguno
void
Object
void
Ninguno
estaVacia()
vaciar()
largo()
verPrimero()
verUltimo()
enfilar(nuevoObjeto)
sacar()
UTILIDAD
Retorna true si la cola est
vaca, sino, false
Remueve todo el contenido de
la cola
Retorna el largo (numero de
elementos) de la cola
Retorna el valor del contenido
de primeroEnLaCola
Retorna el valor del contenido
de ultimoEnLaCola
Aade un nodo que contiene a
nuevoObjeto al final de la cola
Saca el primer nodo de la cola
y retorna su contenido
22
23
24
5. rbol Binario
5.1 Conceptos bsicos
Los rboles son una de las estructuras de datos no lineales ms utilizada. Sirve para
representar estructuras de informacin jerrquicas y direcciones o etiquetas de una manera
organizada.
Dentro de la ciencia de la computacin, los rboles tienen muchas aplicaciones, como, por
ejemplo:
o
o
o
o
o
o
o
Como objetos matemticos los rboles tambin han sido estudiados ampliamente.
Los rboles permiten representar situaciones de la vida diaria como son:
o organizacin de una empresa
o rbol genealgico de una persona
o organizacin de torneos deportivos
Para dar una definicin clara de rbol, podramos decir que un rbol es un conjunto finito
T de uno o ms nodos tal que:
a) Existe un nodo especial llamado la raz del rbol
b) Los nodos restantes estn particionados en m > 0 conjuntos disjuntos T1,...,Tm y
cada uno de estos conjuntos es a su vez un rbol. Los rboles T1,...,Tm son
llamados subrboles de la raz
Cualquier nodo es la raz de un subrbol que consiste de l y los nodos debajo de l. Esto
se deriva de la definicin recursiva de rbol presentada.
Un rbol puede representarse grficamente de muchas formas. Algunas de ellas son por
medio de:
25
o conjuntos anidados:
o parntesis anidados:
o indentacin:
o grafos:
26
La forma ms comn de representar a los rboles es por medio de un grafo con la raz
hacia arriba:
Cada vrtice o nodo del rbol puede tener un nombre y puede tener una informacin
asociada; un arco es una conexin entre dos vrtices.
Un camino en un rbol es una lista de vrtices diferentes en los que vrtices sucesivos
estn conectados por arcos en el rbol. Una propiedad que define a los rboles es que
existe exactamente un camino entre la raz y cada uno de los otros nodos en el rbol.
La longitud de un camino es el nmero de nodos del camino menos uno. Por tanto, hay un
camino de longitud cero de cualquier nodo a si mismo.
Se dice que un nodo Y est abajo de un nodo X, si X est en el camino de Y a la raz.
Adems, cada nodo, excepto la raz, tiene exactamente un nodo arriba de l, que es
llamado su padre; los nodos que estn exactamente abajo de l son llamados sus hijos.
El nmero de hijos que cuelgan de un nodo es llamado el grado del nodo. El grado de un
rbol es el grado mximo de los nodos del rbol. Un nodo de grado cero es llamado hoja,
es decir, no tiene hijos.
Por ejemplo, considera el siguiente rbol:
27
Los nodos de grado 0 son: I, P, K, L, F, M, N, O, y H es decir son las hojas del rbol.
El nico nodo de grado 1 es J.
Los nodos de grado 2 son A, B, D y E.
Los nodos de grado 3 son C y G.
No existen nodos de mayor grado, por tanto, el grado del rbol es 3.
Los nodos de un rbol pueden dividirse en niveles; el nivel de un nodo es el nmero de
nodos en el camino de l a la raz. La altura de un rbol es el nivel mximo de todos los
nodos en el rbol, es decir, la distancia mxima de la raz a cualquier nodo.
Por ejemplo, a continuacin se muestra el nivel de cada nodo del rbol de la figura 5.1.7:
28
29
20, 15 10, 5, 12, 18, 17, 19, 33, 25, 21, 27, 50, 40, 70
in-orden:
5, 10, 12, 15, 17, 18, 19, 20, 21, 25, 27, 33, 40, 50, 70
post-orden: 5, 12, 10, 17, 19, 18, 15, 21, 27, 25, 40, 70, 50, 33, 20
y
a) la llave de bsqueda de n es mayor que todas las llaves de bsqueda de TI
b) la llave de bsqueda de n es menor que todas las llaves de bsqueda de TD
c) TI y TD son rboles binarios de bsqueda
Buscar:
Una ventaja de los rboles binarios de bsqueda es que el algoritmo de bsqueda surge de
una manera natural. Si x es la llave de la raz de un rbol binario de bsqueda y se est
buscando a x, se ha terminado la bsqueda; esto es cierto suponiendo que las llaves de
bsqueda son nicas. Si se busca una llave menor que x, entonces debe encontrarse en el
subrbol izquierdo. Similarmente, si se busca una llave mayor que x, debe buscarse en el
subrbol derecho.
30
As, puede procederse recursivamente hasta encontrar la llave buscada. Por ejemplo,
considere el siguiente rbol binario de bsqueda:
31
VALOR DE
RETORNO
ArbolBinario
TIPOS DE
ARGUMENTO
ArbolBinario, int,
String
buscar(numero)
String
int
mostrarPreOrden()
void
ninguno
UTILIDAD
Inserta un nuevo rbol con la
llave nmero y el contenido
texto en el rbol rbol
Busca el rbol con la raz
nmero y retorna su contenido
Recorre el rbol en pre-orden
mostrarInOrden()
void
ninguno
mostrarPosOrden()
void
ninguno
32
33
34
35
6. La aplicacin ilustrativa
En la carpeta Aplicacin Ilustrativa se encuentra el archivo AplicacionIlustrativa.java,
el cual tiene por objetivo, tal como su nombre lo dice, ilustrar grficamente el
funcionamiento de las estructuras de datos anteriormente presentadas. Puedes ejecutarla
con el pcGrasp o jGrasp, o bien, simplemente hacer doble click sobre el archivo
AplicacionIlustrativa.exe, dentro de la misma carpeta. Es de muy fcil uso y muestra como
funcionan las listas enlazadas, pilas y colas. En el caso que tuvieras alguna duda de su
funcionamiento, solo haz click en el botn Ayuda. Esta aplicacin te servir tambin para
aprender y practicar el uso del paquete de clases swing, as que deberas mirar el cdigo y
tratar de entenderlo. Como desafo, te propongo que hagas una aplicacin parecida para el
rbol binario, en la cual se puedan ingresar y buscar datos, como tambin recorrer el rbol
en pre, in y pos-orden.
Recuerda que para que la aplicacin ilustrativa funcione en tu computador, debes tener
instalada, al menos, la versin 1.4.2 de java. Si no, deja como comentario las lneas 514 y
515 y vuelve a compilar.
36
37