Anda di halaman 1dari 16

1.

Desarrollar los siguientes temas y anexa un ejemplo para cada uno de ellos: a) Arreglos unidimensionales b) Arreglos bidimensionales c) Pilas d) Listas a. Listas doblemente ligadas b. Listas circulares 2. Explicar cmo funcionan los recorridos de rboles binarios en: a) Pre-orden b) Orden c) Post-orden

Arreglos unidimensionales (en Java).


Definicin. Es una coleccin de datos del mismo tipo. Sirve para manejar un nmero n de elementos en comn, ya sea de tipos definidos por el Lenguaje, (int, float, String, etc.) as como aquellos definidos por el programador. Los arreglos en Java son dinmicos, pero no extensibles, lo cual significa que deben ser creados con el tamao que tendrn hasta el final de su vida. Caractersticas: Son de tipos de datos complejos (en el sentido de que no son atmicos). Agrupan varios (1 o ms) fatos de un mismo tipo, llamando el tipo base del arreglo. Son dinmicos, pero no extensibles, lo cual significa que deben ser creados con el tamao que tendrn hasta el final de su vida. Los ndices del arreglo empiezan con 0 y terminan con el tamao del arreglo -1. Si el arreglo tiene n elementos, se denotan como a[0], a[1], , a[n-1]. El ndice en un arreglo empieza siempre desde CERO. Los arrays se crean con el operador new seguido del tipo y nmero de elementos. Declaracin de un arreglo. La sintaxis de declaracin de arreglos en Java es: <tipo> [] <nombre> Para declarar, por ejemplo, un arreglo de nmeros enteros utilizaremos la siguiente sentencia: int[] arrInt;

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

El arreglo an no ha sido creado, sino meramente declarado. Para crear el arreglo (reservar su memoria e inicializarlo) deberemos recurrir al operador new: arrInt = new int[10]; El tipo de datos del arreglo (int[] en este caso) es una clase y cada una de sus instancias debe ser creada explcitamente, el tamao puede pensarse como un parmetro al constructor de la clase. A partir de este momento se puede utilizar arrInt como un arreglo de cualquier otro lenguaje. Una de las caractersticas que hacen de Java un entorno de programacin seguro, y que se relaciona con el manejo de los arreglos es que el lenguaje no permite la indexacin de arreglos fuera de rango, o sea, una asignacin de este tipo generar una excepcin: ArrInt[25] = 1; O tambin se puede declarar de la siguiente forma: tipo nombre_array[]=new tipo[n]; tipo nombre_array[]={valores}; Tamao de un arreglo. Java considera cada arreglo como un solo objeto. El nmero de elementos de un arreglo se conoce accediendo al campo length double [] v = new double [15] System.out.printl(v.length); //escribe 15 El campo length est protegido, no se puede modificar Inicializando el arreglo. 1. Los arrays se pueden inicializar con valores entre llaves {...} separados por comas. 2. Tambin los arrays de objetos se pueden inicializar con varias llamadas a new dentro de unas llaves {} 3. Si se igualan dos referencias a un array no se copia el array, sino que se tiene un array con dos nombres, apuntando al mismo y nico objeto. 4. Creacin de una referencia a un array, se puede hacer de dos maneras: double[] x; //preferible double x[]; 5. Creacin del array con el operador new x = new double[100]; 6. Las lneas 4 y 5 se pueden unir en una sola: double[]x = new double[100]; Arreglos de caracteres y cadenas de texto. Una cadena de texto es un conjunto de caracteres, abcdefg. Son soportados por la clase String: String cadena = abcdefg

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Los arreglos tipo char son secuencias de caracteres, con caractersticas de arreglos de otros tipos: String mas = programador Java char datos[] = {D,i,r,e,c,t,o,r,i,o}; Ejemplo: Cdigo:

Ejecucin:

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Arreglos bidimensionales (en Java).


Definicin.
Es un arreglo de arreglos, es decir, un arreglo unidimensional donde cada elemento es un arreglo. Los arreglos bidimensionales son muy utilizados para el uso de matrices de datos, y poder recorrer los datos guardados dentro de este tipo de arreglos. Caractersticas: Se hace utilizando anidamiento de la estructura de control for( ) Dos ndices en lugar de uno Dimensin: n m Fila, Columna: [x][y] Si A es un arreglo bidimensional A[2][4] es un valor especifico en el arreglo. Se pueden ver como matrices. Declaracin de un arreglo bidimensional. <tipo datoelemento> <nombreArreglo>[][] Tambin se puede declarar: <tipo datoelemento> [][] <nombreArreglo> int tabla[][]; tabla = new int[4][2]; int tabla[][]={valores}; Elemento Tabla[0][0] Tabla[0][1] Tabla[1][0] Tabla[1][1] Tabla[2][0] Tabla[2][1] Tabla[3][0] Tabla[3][1] Posicin relativa en memoria 0 4 8 12 16 20 24 28

Inicializando el arreglo. tabla = new int[4][2]; //4 sern los renglones, mientras 2 //sern las columnas int tabla[][]={{51,52},{54,55},{51,52},{54,55}};

Instituto Politcnico Nacional Ejemplo: Cdigo:

ESIME Unidad Culhuacn

Ejecucin:

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Etc.

Pilas.
Definicin. En las pilas, los tems se aaden y se eliminan en el mismo extremo. Se conocen como colas LIFO (ultimo en entrar, primero en salir).

Instituto Politcnico Nacional Operaciones con pilas.

ESIME Unidad Culhuacn

Aplicaciones de las pilas. Proporcionan un medio ordenado de demorar la realizacin de las tareas secundarias que aparecen durante la ejecucin del programa Suelen ir asociadas a algoritmos recursivos Tipos derivados: pilas de programas, pila del analizador sintctico (parser) Interfaz stack. public interface Stack { public boolean isEmpty(); public void push( Object o); public Objetct pop() throws EmptyStackExceptio; public void clear(); } Inversin mediante pila del orden de un array. public class Reverse { public static void main(String args[]) { int [] array = { 1, 2, 3, 4, 5 }; int i; Stack stack = new ArrayStack(); for ( i = 0; i < array.length; i++ ) stack.push( new Integer( array[ i ] )); i = 0; while ( !stack.isEmpty() ) { array[ i ] = ((Integer) stack.pop()).intValue(); System.out.println( array[ i++ ] ); } } }

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Implementacin de pilas basada en arrays. En esta implementacin basada en arrays, la posicin en el array del elemento cima de la pila va bajando a medida que se insertan tems, y subiendo a medida que se sacan. El inicio de la pila se hallar siempre en el elemento 0 del array. En cierto sentido, la pila se va formando "cabeza abajo" en el array.

Ejemplo.
public boolean agregarPila (Object o) { /* pregunto si la pila est llena. */ if (puntero == pila.length) { /* Si es que est lleno no se pueden agregar ms registros, por lo tanto retorno falso. */ return false; /* Caso Contrario */ } else { /* Significa que la pila an no est llena y puedo seguir * agregando registros. Y agrego en la posicin puntero. */ pila[puntero]=o; /* Incremento el puntero para que se desplace hacia la siguiente * posicin. */ puntero++; /* Retorno verdadero, porque se agreg el objeto. */ return true; } }

Listas (en Java).


Definicin. Las listas (List) aparecen en los interfaces de usuario para facilitar a los operadores la manipulacin de muchos elementos. En java este componente permite procesar visualmente un conjunto de elementos de tipo string.

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Su primer y ms importante aspecto a recordar, cuando se procese o programe, es que el primer ndice de la lista, es el ndice numero 0(cero). Ejemplo: package ListaEnteros; // clase Nodo con las dos partes de un nodo y su constructor public class Nodo { int dato; Nodo enlace; public Nodo(int x) { dato = x; enlace = null; } } /* clase Lista con las operaciones: insertar por la cabeza y visualizar (recorre los nodos) para mostrar los datos. Adems, el atributo primero, que apunta al primer nodo. */ package ListaEnteros; public class Lista { private Nodo primero; public Lista() { primero = null; } public Lista insertarCabezaLista(int entrada) { Nodo nuevo ; nuevo = new Nodo(entrada); nuevo.enlace = primero; primero= nuevo; return this; } public void visualizar() { Nodo n; int k = 0; n = primero; while (n != null) { System.out.print(n.dato + " ");

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

n = n.enlace; k++; System.out.print( (k%15 != 0 ? " " : "\n")); } } } // clase con mtodo main import java.util.*; import ListaEnteros.*; public class ListaAleatoria { public static void main(String [] a) { Random r; int d; Lista lista; int k; r = new Random(); lista = new Lista(); // crea lista vaca k = Math.abs(r.nextInt() % 55); // nmero de nodos // Son insertados elementos en la lista for (; k > 0; k-- ) { d = r.nextInt() % 99 ; lista.insertarCabezaLista(d); } // recorre la lista para escribir sus elementos System.out.println("Elementos de la lista generados al azar"); lista.visualizar(); } }

Listas doblemente ligadas.


Definicin. Una lista doble, doblemente ligada es una coleccin de nodos en la cual cada nodo tiene dos punteros, uno de ellos apuntando a su predecesor (li) y otro a su sucesor (ld). Por medio de estos punteros se podr avanzar o retroceder a travs de la lista, segn se tomen las direcciones de uno u otro puntero. Ejemplo: public class ListaEnlazada { public NodoListaEnlazada PrincipioFin; private int numNodos;

10

Instituto Politcnico Nacional // . . . }

ESIME Unidad Culhuacn

El nodo especial PrincipioFin es sencillo, para simplificar el cdigo. El contador se usa para optimizar los casos ms habituales. Revisemos pues el cdigo de nuestro Hotel, ahora Hotel3.java, que ser prcticamente el mismo que en el caso de los arrays: public class Hotel3 { // Nmero de habitaciones por ala public static final int habPorAla = 12; public static void main( String args[] ) { ListaEnlazada llaveMaestra; llaveMaestra = new ListaEnlazada(); // paso 1 // pasos 2-5

int numPiso = 1; for( int i=0; i < habPorAla; i++ ) // pasos 6-9 llaveMaestra.insertAt( i, new Habitacion( numPiso * 100 + i, ( 0 == (i%2)) ? 2 : 1 ); for( int i=0; i < habPorAla; i++ ) // pasos 10-12 ( (Habitacion)llaveMaestra.getAt(i) ).printData(); } } El paso 1 es la llave maestra de la lista. Est representada por una lista genrica; es decir, una lista de llaves que cumple la convencin que nosotros hemos establecido. Podramos acelerar el tiempo de compilacin metiendo la lista genrica ListaEnlazada dentro de una ListaEnlazadaHabitacion. Los pasos 2 a 5 son equivalentes a los del primer ejemplo. Construimos e inicializamos una nueva ListaEnlazada, que usaremos como juego de llaves maestras. Los pasos 6 a 9 son funcionalmente idnticos a los del ejemplo anterior con arrays, pero con diferente sintaxis. En Java, los arrays y el operador [] son internos del lenguaje. Como Java no soporta la sobrecarga de operadores por parte del usuario, tenemos que usarlo siempre en su forma normal. La ListaEnlazada proporciona el mtodo insertAt() que coge el ndice en la lista, donde el nuevo nodo ha de ser insertado, como primer argumento. El segundo argumento es el objeto que ser almacenado en la lista. Obsrvese que no es necesario colocar moldeo alguno para hacer algo a una clase descendiente que depende de uno de sus padres. Los pasos 10 a 12 provocan la misma salida que los pasos 10 y 11 del ejemplo con arrays. El paso 10 coge la llave del juego que se indica en el mtodo getAt(). En este momento, el sistema no sabe qu datos contiene la llave, porque el contenido de la habitacin es genrico. Pero nosotros s sabemos lo que hay en la lista, as que informamos al sistema haciendo un moldeado a la llave de la habitacin (este casting

11

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

generar un chequeo en tiempo de ejecucin por el compilador, para asegurarse de que se trata de una Habitacin). El paso 12 usa la llave para imprimir la informacin.

Listas circulares.
Definicin. Una lista circular es una lista lineal en la que el ltimo elemento apunta al primero. Entonces es posible acceder a cualquier elemento de la lista desde cualquier punto dado. Las operaciones sobre una lista circular resultan ms sencillas, ya que se evitan casos especiales. La siguiente figura muestra como se ve una lista circular simplemente enlazada.

Cuando recorremos una lista circular, diremos que hemos llegado al final de la misma cuando nos encontremos de nuevo en el punto de partido, suponiendo, desde luego, que el punto de partida se guarda de alguna manera en la lista; por ejemplo, con una referencia fija al mismo. Esta referencia puede ser al primer elemento de la lista; tambin puede ser al ltimo elemento, en cuyo caso tambin es conocida la direccin del primer elemento. Creacin de una lista circular. Primero se tiene que definir la clase de objetos que van a formar parte de la misma. Por ejemplo, cada elemento de la lista puede definirse como una estructura de datos con dos miembros: una referencia al elemento siguiente y otra al rea de datos. El rea de datos puede ser un tipo predefinido o de un tipo definido por el usuario. Segn esto, el tipo de cada elemento de la lista puede venir definido de la forma siguiente: private class CElemento { //atributos private Object datos; private CElementos siguiente; //siguiente elemento //mtodos private CElemento(){} //constructor private CElemento(Object d, CElemento s)//constructor { datos = d; siguiente = s; }

12

Instituto Politcnico Nacional } Ejemplo. Cdigo:

ESIME Unidad Culhuacn

Se debe declarar una clase que sea un nodo o elemento en la cual tengas una referencia al siguiente nodo de la lista. public class Elemento { private Elemento elementoSiguiente; public Elemento getElementoSiguiente() { return elementoSiguiente; } public void setElementoSiguiente(Elemento elementoSiguiente) { this.elementoSiguiente = elementoSiguiente; } } Luego puedes crearte una lista a la cual le aadas los elementos, dentro de esta clase puedes usar un Collection o un array o un List. Esta lista es solo para poder acceder a los elementos de forma ms fcil. Al momento de crear un nuevo elemento lo asignas al elemento anterior. List list = new ArrayList(); Elemento elemento = (Elemento)list.get(list.size()-1); elemento.setSiguienteElemento(new Elemento());

Recorridos de rboles binarios.


Hay varios algoritmos para el manejo de estructuras en rbol y un proceso que generalmente se repite en estos algoritmos es el de recorrido de un rbol. Este proceso cosiste en examinar sistemticamente los nodos de un rbol de forma que cada nodo sea visitado solamente una vez. Se pueden utilizar tres formas para recorrer un rbol binario: pre-orden, inorden y post-orden.

13

Instituto Politcnico Nacional

ESIME Unidad Culhuacn

Recorrido en forma pre-orden. Cuando se utiliza la forma pre-orden, primero se visita la raz despus el subrbol izquierdo y por ltimo se visita el subrbol derecho. El recorrido en pre-orden produce la notacin prefija. Pre-orden: R, I, D

Ejemplo: Cdigo: ///// clase rbol binario. public class CArbolBinario { //atributos del rbol binario private CNodo raz; //raz del rbol //nodo de un rbol binario private class CNodo { //atributos private Object datos; private CNodo izquierdo; private CNodo derecho; //mtodos public CNodo(){}

//referencia a los datos //raz del subrbol izquierdo //raz del subrbol derecho

//constructor } //mtodos del rbol binario public CArbolBinario(){} //constructor public void preorden(CNodo r) { if ( r != null ) { //escribir aqu las operaciones a realizar con el nodo //referenciado r preorden( r.izquiero); //se visita el subrbol izquierdo preorden( r.derecho); //se visita el subrbol derecho } } Recorrido en forma in-orden. Primero se visita el subrbol izquierdo, despus la raz y por ltimo el subrbol derecho. El recorrido en in-orden produce la notacin convencional. In-orden: I, R, D

14

Instituto Politcnico Nacional Ejemplo. Cdigo: ///// Clase rbol binario. public class CArbolBinario { //atributos del rbol binario private CNodo raz; //raz del rbol //nodo de un rbol binario private class CNodo { //atributos private Object datos; private CNodo izquierdo; private CNodo derecho; //mtodos public CNodo(){}

ESIME Unidad Culhuacn

//referencia a los datos //raz del subrbol izquierdo //raz del subrbol derecho

//constructor } //mtodos del rbol binario public CArbolBinario(){} //constructor public void inorden(CNodo r) { if ( r != null ) { inorden( r.izquierdo); //se visita el subrbol izquierdo //escribir aqu las operaciones a realizar con el nodo //referenciado r inorden( r.derecho); // se visita el subrbol derecho } } Recorrido en forma post-orden. Primero se visita el subrbol izquierdo, despus el subrbol derecho y por ltimo la raz. El recorrido en post-orden produce la notacin postfija o inversa.

Post-orden: I, D, R Ejemplo. Cdigo: ///// clase rbol binario. public class CArbolBinario { //atributos del rbol binario private CNodo raz; //raz del rbol

15

Instituto Politcnico Nacional //nodo de un rbol binario private class CNodo { //atributos private Object datos; private CNodo izquierdo; private CNodo derecho; //mtodos public CNodo(){}

ESIME Unidad Culhuacn

//referencia a los datos //raz del subrbol izquierdo //raz del subrbol derecho

//constructor } //mtodos del rbol binario public CArbolBinario(){} //constructor public void postorden(CNodo r) { if ( r != null ) { postorden( r.izquierdo);

//se visita el subrbol izquierdo postorden( r.derecho); //se visita el subrbol derecho //escribir aqu las operaciones a realizar con el nodo //referenciado r

} }

16