Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ed PDF
Ed PDF
1. Antecedentes
Introduccin a la Orientacin a Objetos
Encapsulacin.
Polimorfismo.
Herencia.
En cualquier caso, la clase hija hereda todas las cualidades asociadas con
la clase padre y le aade sus propias caractersticas definitorias. Sin el uso de
clasificaciones ordenadas, cada objeto tendra que definir todas las
caractersticas que se relacionan con l explcitamente.
Ejemplos de tipos de datos abstractos son las Listas, Pilas, Colas, etc., que se
discutirn ms adelante.
Estructuras de Datos
Resumen de Java
2. Arreglos
Arreglos lineales
Declaracin:
Como se sabe, hay 2 tipos de datos en Java: primitivos (como int y double) y
objetos. En muchos lenguajes de programacin (an en Orientados a Objetos
como C++) los arreglos son tipos primitivos, pero en Java son tratados como
objetos. Por consiguiente, se debe utilizar el operador new para crear un
arreglo:
Para acceder a los elementos de un arreglo se debe utilizar los corchetes, muy
similar a otros lenguajes de programacin:
Ejemplo:
// array.java
// demonstrates Java arrays
////////////////////////////////////////////////////////////////
class ArrayApp
{
public static void main(String[] args) {
int[] arr; // reference
arr = new int[100]; // make array
int nElems = 0; // number of items
int j; // loop counter
int searchKey; // key of item to search for
//--------------------------------------------------------------
arr[0] = 77; // insert 10 items
arr[1] = 99;
arr[2] = 44;
arr[3] = 55;
arr[4] = 22;
arr[5] = 88;
arr[6] = 11;
arr[7] = 00;
arr[8] = 66;
arr[9] = 33;
nElems = arr.length; // now 10 items in array
//-------------------------------------------------------------
for (j=0; j<nElems-1; j++) // display items {
System.out.print(arr[j] + " ");
System.out.println("");
}
//--------------------------------------------------------------
searchKey = 66; // find item with key 66
for (j=0; j<nElems; j++) // for each element,
if(arr[j] == searchKey) // found item?
break; // yes, exit before end
if(j == nElems) // at the end?
System.out.println("Can't find " + searchKey); // yes
else
System.out.println("Found " + searchKey); // no
//--------------------------------------------------------------
searchKey = 55; // delete item with key 55
for (j=0; j<nElems; j++) // look for it
if(arr[j] == searchKey)
break;
for (int k=j; k<nElems; k++) // move higher ones down
arr[k] = arr[k+1];
nElems--; // decrement size
//--------------------------------------------------------------
for (j=0; j<nElems; j++) { // display items
System.out.print( arr[j] + " ");
System.out.println("");
}
} // end main()
} // end class ArrayApp
77 99 44 55 22 88 11 0 66 33
Found 66
77 99 44 22 88 11 0 66 33
- Insertar elementos
- Bsqueda de elementos
- Eliminar elementos
- Mostrar los elementos
- Ordenar los elementos
- Modificar algn elemento
Arreglos bidimensionales
double [][] temperatures = new double [2][2]; // Dos filas y dos columnas.
3. Listas ligadas
Definicin
Ahora veremos una estructura de datos que resuelve los problemas anteriores,
llamada lista ligada. Las listas ligadas, son probablemente, la segunda
estructura de almacenamiento de propsito general ms comnmente
utilizadas, despus de los arreglos.
Algunas listas ms complejas son las listas doblemente ligadas o las listas
circulares, por nombrar algunas.
Lista doblemente ligada
Lista circular
Listas desordenadas
Tope de la Lista
Lgicamente, una lista es tan solo un objeto de una clase Lista que se
conforma de un tope (posicin de inicio) de lista y un conjunto de mtodos
para operarla.
Una lista ordenada, es una extensin de las listas normales con la cualidad
de que todos sus datos se encuentran en orden. Como al igual que las listas se
debe poder insertar datos, hay dos formas de garantizar el orden de los
mismos:
Nuestro Dato
La clase Lista
NULL
Tope de la lista
Consideraciones:
null
Tope de la
Nodo que se
lista
eliminar
null
Tope de la
lista
Nodo que se
eliminar
null
Tope de la
lista Nodo que se
eliminar
Mostrar la lista
Funciones adicionales
a) tamao de la lista
b) lista vaca
c) fin de la lista
d) insertar en una lista ordenada
e) ordenar una lista desordenada
f) buscar un elemento de la lista
4. Pilas
Definicin
Aunque los objetos son todos diferentes, todos ilustran el concepto de pila
(stack). Una pila, es una particularizacin de las listas y se puede definir como
una estructura en la cual los elementos son agregados y eliminados en el tope
de la lista. Es una estructura LIFO (L ast In First Out el primero que llega es el ltimo
que sale).
Las pilas cuentan solo con 2 operaciones, conocidas como PUSH, insertar
un elemento en el tope de la pila, y POP, leer el elemento del tope de la pila.
Veamos como funcionan estos mtodos:
PUSH
Tope
de la
pila
Tope
de la
pila
Tope de la pila
POP
Tope aux
2.- Hacer el tope de la pila igual al siguiente del temporal
Tope
3.- Regresar el valor del nodo temporal antes que desaparezca
Tope
Implementacin de pilas
Para trabajar con pilas, utilizaremos la misma base con la que trabajamos
para las listas. Dispondremos de 2 clases: Pila y NodoDePila. Con la primera
crearemos a la pila y las operaciones sobre ella y con la segunda
instanciaremos a cada uno de los nodos de la pila.
Una cola es una estructura de datos similar a una lista con restricciones
especiales. Los elementos son agregados en la parte posterior de la cola y son
eliminados por el frente. Esta estructura es llamada FIFO (F irst In, First Out el
primero que llega, es el primero en salir). Considere la siguiente figura:
ltimo primero
Construccin de colas
Insertar
Insertar un dato en una cola es muy similar a hacerlo en una pila o una
lista, la diferencia es que tendremos que hacerlo por el final de la cola. A
este proceso se le llama encolar.
ltimo primero
ltimo primero
ltimo primero
Eliminar
1.-
ltimo primero
2.-
ltimo ltimo
3.-
ltimo primero
6. rboles
Recursin
Alguna vez hemos visto ese conjunto de muecos de madera de origen ruso
(matrioshkas) en la que uno se encuentra dentro de otro. Dentro del primer
mueco, se encuentra un mueco menor, y dentro de ese mueco, hay otro
mueco de menor tamao y as sucesivamente. Un mtodo recursivo es como
los muecos rusos: se reproducen a s mismo con versiones ms y ms
pequeas.
Sucesin de Fibonacci
Encontrar un nodo hoja en rboles
Recorrer una lista
Etc
Definicin
rboles binarios
Salvo que trabajemos con rboles especiales, como los que veremos ms
adelante, las inserciones sern siempre en punteros de nodos hoja o en
punteros libres de nodos rama. Con estas estructuras no es tan fcil
generalizar, ya que existen muchas variedades de rboles.
Recorridos
Esos recorridos dependen en gran medida del tipo y propsito del rbol,
pero hay ciertos recorridos que usaremos frecuentemente. Se trata de
aquellos recorridos que incluyen todo el rbol.
RecorrerArbol(raiz);
Pre-orden:
void PreOrden(NodoDeArbol a) {
if (a == NULL) return;
Procesar(dato); //mtodo que lee el dato
RecorrerArbol(a.izq);
RecorrerArbol(a.centro);
RecorrerArbol(a.der);
}
ABEKFCGLMDHIJNO
In-orden:
void InOrden(NodoDeArbol a) {
if (a == NULL) return;
RecorrerArbol(a.izq);
Procesar(dato); //mtodo que lee el dato
RecorrerArbol(a.centro);
RecorrerArbol(a.der);
}
Post-orden:
void PostOrden(NodoDeArbol a) {
if (a == NULL) return;
RecorrerArbol(a.izq);
RecorrerArbol(a.centro);
RecorrerArbol(a.der);
Procesar(dato); //mtodo que lee el dato
}
KEFBLMGCHINOJDA
Arboles ordenados
Operaciones en ABB.
Buscar un elemento.
Insertar un elemento.
Eliminar un elemento.
Movimientos a travs del rbol:
o Izquierda.
o Derecha.
o Raz.
Informacin:
o Comprobar si un rbol est vaco.
o Calcular el nmero de nodos.
o Comprobar si el nodo es hoja.
o Calcular el nivel de un nodo.
o Calcular la altura de un rbol.
Buscar un elemento.
Insertar un elemento.
Padre = NULL
nodo = Raiz
Bucle: mientras actual no sea un rbol vaco o hasta que se encuentre
el elemento.
o Si el valor del nodo raz es mayor que el elemento que
buscamos, continuaremos la bsqueda en el rbol izquierdo:
Padre=nodo, nodo=nodo->izquierdo.
Padre=nodo, nodo=nodo->derecho.
Eliminar un elemento.
Padre = NULL
Si el rbol est vaco: el elemento no est en el rbol, por lo tanto
salimos sin eliminar ningn elemento.
(*) Si el valor del nodo raz es igual que el del elemento que buscamos,
estamos ante uno de los siguientes casos:
o El nodo raz es un nodo hoja:
Si 'Padre' es NULL, el nodo raz es el nico del rbol, por
lo tanto el puntero al rbol debe ser NULL.
Si raz es la rama derecha de 'Padre', hacemos que esa
rama apunte a NULL.
Si raz es la rama izquierda de 'Padre', hacemos que esa
rama apunte a NULL.
Eliminamos el nodo, y salimos.
o El nodo no es un nodo hoja:
Buscamos el 'nodo' ms a la izquierda del rbol derecho de
raz o el ms a la derecha del rbol izquierdo. Hay que
tener en cuenta que puede que slo exista uno de esos
rboles. Al mismo tiempo, actualizamos 'Padre' para que
apunte al padre de 'nodo'.
Intercambiamos los elementos de los nodos raz y 'nodo'.
Borramos el nodo 'nodo'. Esto significa volver a (*), ya que
puede suceder que 'nodo' no sea un nodo hoja.
Si el valor del nodo raz es mayor que el elemento que buscamos,
continuaremos la bsqueda en el rbol izquierdo.
Si el valor del nodo raz es menor que el elemento que buscamos,
continuaremos la bsqueda en el rbol derecho.
Para movernos a travs del rbol usaremos punteros auxiliares, de modo que
desde cualquier puntero los movimientos posibles sern: moverse al nodo raz
de la rama izquierda, moverse al nodo raz de la rama derecha o moverse al
nodo Raz del rbol.
Informacin
Tenemos dos opciones para hacer esto, una es llevar siempre la cuenta de
nodos en el rbol al mismo tiempo que se aaden o eliminan elementos. La
otra es, sencillamente, contarlos.
Para contar los nodos podemos recurrir a cualquiera de los tres modos de
recorrer el rbol: inorden, preorden o postorden, como accin sencillamente
incrementamos el contador.
Esto es muy sencillo, basta con comprobar si tanto el rbol izquierdo como el
derecho estn vacos. Si ambos lo estn, se trata de un nodo hoja.
2, 4, 5, 8, 9, 12
Bibliografa
[1] Nell Dale, Object-oriented Data Structures using Java, Jones and Bartlett
Publishers, 2002.
[2] Robert Lafore, Data Structures and Algorithms in Java, Sams, 1998.