Está en la página 1de 8

CORPORACIÓN UNIVERSITARIA DE CIENCIA Y DESARROLLO

Taller de Pila, Cola y Arboles en Java

Luis Daniel Becerra Araque

12/09/2019
Pila en Java

Una pila es una estructura que nos permite apilar elementos y recopilarlos en el orden
inverso al cual los apilamos mediante operaciones de desapilar.

Esto es lo que se conoce como estructuras LIFO (Last In First Out). De esta manera
una pila suele tener 3 operaciones básicas:

• apilar, añade un elemento a la lista.


• desapilar, retira un elemento de la lista
• ¿está vacía?, comprueba si la lista está vacía.

En el lenguaje Java contamos con la clase Stack en la librería java.util. Es


importante saber que la pila hereda de la pila (aka Vector). Y que por lo tanto
podemos utilizar los elementos del Vector sobre la pila.

En nuestro ejemplo vamos a insertar 10 elementos, que serán números, y los


recuperaremos en su orden inverso.
Lo primero será definir la pila, es decir, instanciar la clase Stack.

1. Stack<String> pila = new Stack<String>();

Como vemos el tipo de elementos que insertaremos en la pila serán String


-cadenas-.
Una vez instanciada vamos a ir creando los elementos e insertándolos en la pila. El
método que inserta elementos en la pila es .push(). Este método recibirá como
parámetro el elemento a insertar.

1.for (int x=1;x<=10;x++)


2.pila.push(Integer.toString(x));

Hemos creado un bucle que nos vaya creando los números y nos hemos apoyado en
la clase Integer y su método .toString() para convertir los números en cadena.

Una vez que tenemos todos los elementos, procedemos al vaciado de la pila. Tendremos
que interactuar sobre la pila hasta que esta esté vacía, cosa que nos dice el método
.empty(). En cada una de las iteraciones extraeremos un elemento de la pila mediante el
método .pop()

1.while (!pila.empty())
2.System.out.println(pila.pop());

Pocas líneas de código que nos ayudan a crear una pila en Java.

2 | Página
Cola en Java

Los elementos de la cola se añaden y se eliminan de tal manera que el primero en


entrar es el primero en salir. La adición de elementos se realiza a través de una
operación llamada encolar (enqueue), mientras que la eliminación se denomina
desencolar (dequeue. La operación de encolar inserta elementos por un extremo de la
cola, mientras que la de desencolar los elimina por el otro.

El siguiente interfaz muestras las operaciones típicas para colas:

Cola.java

La siguiente es una posible implementación de colas mediante la clase Nodo:

ColaEnlazada.java

3 | Página
Vemos como la clase Cola contiene dos campos, cola y cabecera que apuntan al
principio y al final de la cola. La cabecera la utilizaremos para extraer elementos. Para
insertar utilizaremos la cola.
La operación encolar crea un nodo cuyo sucesor es nulo. Esto es porque añadimos al
final de la cola, es decir, donde apunta el campo cola. Si la cola es vacía la cabecera y la
cola apuntan al mismo objeto Nodo.

Para eliminar (desencolar) y para consultar (cabecera) se utiliza el campo cabecera. Se


extraen/consultan elementos de la cabeza de la cola.

4 | Página
Arboles en Java

La estructura de datos árbol al contrario que las listas es una estructura de datos no
lineal. Las listas tienen un orden impuesto en sus elementos teniendo como mucho un
predecesor y un sucesor. Los árboles pueden tener dos o más sucesores.

Un árbol consiste en un conjunto de nodos o vértices y un conjunto de aristas o arcos


que satisface unos requisitos:
• Existe una jerarquía de nodos, de forma que a cada nodo hijo le llega una arista
de otro nodo padre. De esta forma se establece la relación padre-hijo: p es padre
de h, h es un hijo de p.
• El nodo donde comienza la jerarquía se llama nodo raíz. A este nodo no llegan
arcos de ningún otro nodo, en otras palabras, no es hijo de ningún nodo padre.
• Existe un camino único entre la raíz y cualquiera de los nodos del árbol
Veremos ahora un poco de terminología relacionada con
los árboles. En primer lugar estudiaremos qué tipos de
nodos nos podremos encontrar en un árbol. Hemos visto
que existe un nodo especial, el nodo raiz que no tiene
padres. El caso de los nodos que no tienen hijos es el de
los nodos externos o nodos hoja. El resto de nodos son
internos, cuando tiene descendientes. Diremos que un
nodo es descendiente de otro, si es hijo de él ó
descendiente de sus hijos. Los descendientes nos
determinan un subárbol con raíz el nodo descendiente.

Veremos ahora aquellos conceptos que nos dan una idea sobre la topología del árbol.
Son los conceptos de camino, longitud y profundidad:

• El camino existente entre dos nodos, es la secuencia de "arcos" que nos llevan,
siguiéndolas de forma consecutiva del primero al segundo. La longitud es el
número de aristas que contiene.

• Profundidad de un nodo es la longitud del camino de la raíz a ese nodo.

5 | Página
• Altura de un árbol es la profundidad máxima entre todos los nodos extremos del
árbol. Es decir, "la profundidad del nodo más profundo".

Por simplificar el estudio de los árboles veremos el caso de los árboles binarios. Un
árbol binario es un árbol en el que cada nodo tiene 0 ó 2 hijos (el hijo izquierdo y el
derecho). Este árbol podrá ser ordenado si para cada nodo existe un orden lineal para
todos su hijos, es decir, si tenemos el orden "menor que", un árbol será ordenado si para
cada nodo sus hijos son menores que el padre.

Al igual que las listas la forma de definir los árboles es de manera recursiva.
Definiremos inicialmente una clase Nodo que represente cada uno de los nodos del
árbol:

Por simplificar el estudio de los árboles veremos el caso de los árboles binarios. Un
árbol binario es un árbol en el que cada nodo tiene 0 ó 2 hijos (el hijo izquierdo y el
derecho). Este árbol podrá ser ordenado si para cada nodo existe un orden lineal para
todos su hijos, es decir, si tenemos el orden "menor que", un árbol será ordenado si para
cada nodo sus hijos son menores que el padre.
Al igual que las listas la forma de definir los árboles es de manera recursiva.
Definiremos inicialmente una clase Nodo que represente cada uno de los nodos del
árbol:

Cada uno de los objetos de tipo NodoBinario representa una estructura de datos
compuesta por el elemento que se almacena en cada nodo y dos nodos que llamaremos
nodoizq y nododcha. Puesto que los nodos binario pueden tener 0 ó 2 hijos, se
han definido dos tipos de constructores para cubrir los dos casos. El resto de métodos
son para manipular la clase nodo de forma transparente. A partir de esta clase
NodoBinario se define la clase ArbolBinario como sigue:

6 | Página
Notesé que un ArbolBinario como máximo puede tener un hijo, si es el caso usaremos
el constructor con un solo parámetro si no es así utilizaremos el constructor por defecto,
es decir, el constructor sin parámetros.

Un ArbolBinario no es mas que un NodoBinario llamado raiz. Vemos en el siguiente


esquema cómo sería gráficamente la estructura del árbol:

Vamos a ver cómo se calcularía el tamaño del árbol a partir de esta definición:

Definimos una función auxiliar que calcula el tamaño de un subárbol bajo un nodo. Este
método calcula una longitud 0 si el Nodo es nulo. En otro caso, la longitud será la suma
de los tamaños de los nodos hijos más uno, correspondiente al nodo actual. El método
tamaño llama al método tam_aux con el nodo raiz.

7 | Página
Veremos las distintas formas de recorrer un árbol en el capítulo de Exploración de
árboles

Bibliografía

(Ciberaula http://www.ciberaula.com/cursos/java/)

(SerProgramador https://serprogramador.es/)

8 | Página

También podría gustarte