Empezaremos este blog, para tener un beneficio con respecto a nuestra materia de Estructura de Datos, para tener un contacto mas serca con nuestra maestra, y con nuestros companeros de salon.
Les dejo aqui mi URL para que puedan guardarla y visitar mi blog mas seguido ;) ...
http://prospero-estruc-dts.blogspot.com/
Espero y sea de su agrado y ademas de ayuda para esta materia.
Gracias.
Victor Martinez**
Este blog tiene como objetivo estar en contacto con los miembros de nuestra clase de Estructura de datos, y para que nuestra maestra revise nuestras tareas ;) y saquemos 100 =)
Buscar este blog
Busqueda
Binaria:
Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si es mayor está en el segundo. Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:
Se toma el elemento central y se divide el array en dos: {1,2,3,4}−5-{6,7,8,9} Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray: {1,2,3,4} Se vuelve a dividir el array en dos: {1}−2-{3,4} Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4} Se vuelve a dividir en dos: {}−3-{4} Como el elemento buscado coincide con el central, lo hemos encontrado.
Uploaded with ImageShack.us
Codigo Binario:
int desde,hasta,medio,elemento,posicion; // desde y
// hasta indican los límites del array que se está mirando.
int array[N];
// Dar valor a elemento.
for(desde=0,hasta=N-1;desde<=hasta;) { if(desde==hasta) // si el array sólo tiene un elemento: { if(array[desde]==elemento) // si es la solución: posicion=desde; // darle el valor. else // si no es el valor: posicion=−1; // no está en el array. break; // Salir del bucle. } medio=(desde+hasta)/2; // Divide el array en dos. if(array[medio]==elemento) // Si coincide con el central: { posicion=medio; // ese es la solución break; // y sale del bucle. } else if(array[medio]>elemento) // si es menor:
hasta=medio-1; // elige el array izquierda.
else // y si es mayor:
desde=medio+1; // elige el array de la derecha.
}
Para utilizar este algoritmo, el array debe estar ordenado. La búsqueda binaria consiste en dividir el array por su elemento medio en dos subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray, y si es mayor está en el segundo. Por ejemplo, para buscar el elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:
Se toma el elemento central y se divide el array en dos: {1,2,3,4}−5-{6,7,8,9} Como el elemento buscado (3) es menor que el central (5), debe estar en el primer subarray: {1,2,3,4} Se vuelve a dividir el array en dos: {1}−2-{3,4} Como el elemento buscado es mayor que el central, debe estar en el segundo subarray: {3,4} Se vuelve a dividir en dos: {}−3-{4} Como el elemento buscado coincide con el central, lo hemos encontrado.
Uploaded with ImageShack.us
Codigo Binario:
int desde,hasta,medio,elemento,posicion; // desde y
// hasta indican los límites del array que se está mirando.
int array[N];
// Dar valor a elemento.
for(desde=0,hasta=N-1;desde<=hasta;) { if(desde==hasta) // si el array sólo tiene un elemento: { if(array[desde]==elemento) // si es la solución: posicion=desde; // darle el valor. else // si no es el valor: posicion=−1; // no está en el array. break; // Salir del bucle. } medio=(desde+hasta)/2; // Divide el array en dos. if(array[medio]==elemento) // Si coincide con el central: { posicion=medio; // ese es la solución break; // y sale del bucle. } else if(array[medio]>elemento) // si es menor:
hasta=medio-1; // elige el array izquierda.
else // y si es mayor:
desde=medio+1; // elige el array de la derecha.
}
Busqueda
Secuencial:
Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez.
La variante más simple del problema es la búsqueda de un número en un vector.
Uploaded with ImageShack.us
Codigo Secuencial:
["aarona","aashta","abelarda","abelia","abigail","abril"] , todos de
tipo String y queremos saber si ya existe el nombre : "Abigail" en nuestro vector entonces tenemos que hacer lo siguiente:
public class BSecuencial {
public static void main(String[] args) throws IOException {
BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
int encontrados=0;
String [] VectorNombres = {"Aarona","Aashta","Abelarda","Abelia","Abigail ",
"Abril"};
System.out.print("Digite el nombre que desea buscar: ");
String nombre = entrada.readLine();
// entrada de dato a buscar
for (int i=0; i
if(nombre.equalsIgnoreCase(VectorNombres[i])){
JOptionPane.showMessageDialog(null,"Elemento encontrado "+VectorNombres[i],"Encontrado",
JOptionPane.INFORMATION_MESSAGE);
encontrados++;
continue;
}
}
if(encontrados == 1 ){
System.out.println("Fin de busqueda, encontrado "+encontrados+" elemento igual");
}else{
System.out.println("Fin de búsqueda, encontrados "+encontrados+" elementos iguales");
Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con ciertas propiedades dentro de una estructura de datos; por ejemplo, ubicar el registro correspondiente a cierta persona en una base de datos, o el mejor movimiento en una partida de ajedrez.
La variante más simple del problema es la búsqueda de un número en un vector.
Uploaded with ImageShack.us
Codigo Secuencial:
["aarona","aashta","abelarda","abelia","abigail","abril"] , todos de
tipo String y queremos saber si ya existe el nombre : "Abigail" en nuestro vector entonces tenemos que hacer lo siguiente:
public class BSecuencial {
public static void main(String[] args) throws IOException {
BufferedReader entrada = new BufferedReader (new InputStreamReader(System.in));
int encontrados=0;
String [] VectorNombres = {"Aarona","Aashta","Abelarda","Abelia","Abigail ",
"Abril"};
System.out.print("Digite el nombre que desea buscar: ");
String nombre = entrada.readLine();
// entrada de dato a buscar
for (int i=0; i
if(nombre.equalsIgnoreCase(VectorNombres[i])){
JOptionPane.showMessageDialog(null,"Elemento encontrado "+VectorNombres[i],"Encontrado",
JOptionPane.INFORMATION_MESSAGE);
encontrados++;
continue;
}
}
if(encontrados == 1 ){
System.out.println("Fin de busqueda, encontrado "+encontrados+" elemento igual");
}else{
System.out.println("Fin de búsqueda, encontrados "+encontrados+" elementos iguales");
Busqueda Hash
Hash:
En informática, hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.
Una función de hash es una función para resumir o identificar probabilísticamente un gran conjunto de información, dando como resultado un conjunto imagen finito generalmente menor (un subconjunto de los números naturales por ejemplo). Varían en los conjuntos de partida y de llegada y en cómo afectan a la salida similitudes o patrones de la entrada. Una propiedad fundamental del hashing es que si dos resultados de una misma función son diferentes, entonces las dos entradas que generaron dichos resultados también lo son.
Es posible que existan claves resultantes iguales para objetos diferentes, ya que el rango de posibles claves es mucho menor que el de posibles objetos a resumir (las claves suelen tener en torno al centenar de bits, pero los ficheros no tienen un tamaño límite).
Son usadas en múltiples aplicaciones, como los arrays asociativos, criptografía, procesamiento de datos y firmas digitales, entre otros. Una buena función de hash es una que experimenta pocas colisiones en el conjunto esperado de entrada; es decir que se podrán identificar unívocamente las entradas (ver función inyectiva).
Muchos sistemas relacionados con la seguridad informática usan funciones o tablas hash.
Uploaded with ImageShack.us
En informática, hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.
Una función de hash es una función para resumir o identificar probabilísticamente un gran conjunto de información, dando como resultado un conjunto imagen finito generalmente menor (un subconjunto de los números naturales por ejemplo). Varían en los conjuntos de partida y de llegada y en cómo afectan a la salida similitudes o patrones de la entrada. Una propiedad fundamental del hashing es que si dos resultados de una misma función son diferentes, entonces las dos entradas que generaron dichos resultados también lo son.
Es posible que existan claves resultantes iguales para objetos diferentes, ya que el rango de posibles claves es mucho menor que el de posibles objetos a resumir (las claves suelen tener en torno al centenar de bits, pero los ficheros no tienen un tamaño límite).
Son usadas en múltiples aplicaciones, como los arrays asociativos, criptografía, procesamiento de datos y firmas digitales, entre otros. Una buena función de hash es una que experimenta pocas colisiones en el conjunto esperado de entrada; es decir que se podrán identificar unívocamente las entradas (ver función inyectiva).
Muchos sistemas relacionados con la seguridad informática usan funciones o tablas hash.
Uploaded with ImageShack.us
Ordenamiento
Burbuja:
La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar.
Uploaded with ImageShack.us
Codigo Burbuja:
/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/
package ordenaburbuja;
/**
*
* @author Mi Gateway
*/
class OrdenaAlgoritmo {
public static void ordenar( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
for (int i = 0; i < arreglo.length; i++) { ++pasadas; for (int j = 0; j < arreglo.length - 1; j++) { ++comparaciones; if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
}
}
}
estadisticas(pasadas, comparaciones);
}
public static void ordenarMejorado( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
boolean hayCambios = true;
for (int i = 0; hayCambios ; i++) {
++pasadas;
hayCambios = false;
for (int j = 0; j < arreglo.length - 1; j++) { ++comparaciones; if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
hayCambios = true;
}
}
}
estadisticas(pasadas, comparaciones);
}
private static void intercambiar(int [] arreglo, int a, int b) {
int tmp = arreglo[a];
arreglo[a] = arreglo[b];
arreglo[b] = tmp;
}
private static void estadisticas( int pasadas, int comparaciones) {
System.out.println( "Pasadas: " + pasadas );
System.out.println( "Comparaciones: " + comparaciones );
}
}
public class OrdenaBurbuja {
public static void main (String args[]) {
int [] valores = {15,35,01,05,04,03,19,45,13,02,55,8,
78,997,451,546,12,16,24,103,99,784,
4541,15};
//OrdenaAlgoritmo.ordenar(valores);
OrdenaAlgoritmo.ordenarMejorado(valores);
// Mostrar arreglo.
for (int i = 0; i < valores.length ; i++)
System.out.println ( "valores["+i+"]: "+ valores[i]);
}
}
La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada. Este algoritmo obtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeñas "burbujas". También es conocido como el método del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparación, siendo el más sencillo de implementar.
Uploaded with ImageShack.us
Codigo Burbuja:
/*
* To change this template, choose Tools Templates
* and open the template in the editor.
*/
package ordenaburbuja;
/**
*
* @author Mi Gateway
*/
class OrdenaAlgoritmo {
public static void ordenar( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
for (int i = 0; i < arreglo.length; i++) { ++pasadas; for (int j = 0; j < arreglo.length - 1; j++) { ++comparaciones; if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
}
}
}
estadisticas(pasadas, comparaciones);
}
public static void ordenarMejorado( int [] arreglo) {
int pasadas = 0;
int comparaciones = 0;
boolean hayCambios = true;
for (int i = 0; hayCambios ; i++) {
++pasadas;
hayCambios = false;
for (int j = 0; j < arreglo.length - 1; j++) { ++comparaciones; if (arreglo[j] > arreglo[j + 1]) {
intercambiar(arreglo, j, j+1);
hayCambios = true;
}
}
}
estadisticas(pasadas, comparaciones);
}
private static void intercambiar(int [] arreglo, int a, int b) {
int tmp = arreglo[a];
arreglo[a] = arreglo[b];
arreglo[b] = tmp;
}
private static void estadisticas( int pasadas, int comparaciones) {
System.out.println( "Pasadas: " + pasadas );
System.out.println( "Comparaciones: " + comparaciones );
}
}
public class OrdenaBurbuja {
public static void main (String args[]) {
int [] valores = {15,35,01,05,04,03,19,45,13,02,55,8,
78,997,451,546,12,16,24,103,99,784,
4541,15};
//OrdenaAlgoritmo.ordenar(valores);
OrdenaAlgoritmo.ordenarMejorado(valores);
// Mostrar arreglo.
for (int i = 0; i < valores.length ; i++)
System.out.println ( "valores["+i+"]: "+ valores[i]);
}
}
Ordenamiento
QuickSort:
El ordenamiento rápido (quicksort en inglés) es un algoritmo creado por el científico británico en computación C. A. R. Hoare basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
Uploaded with ImageShack.us
Codigo QuickSort:
package quicksort;
public class Ordenador {
public int[] quicksort(int numeros[])
{
return quicksort(numeros,0,numeros.length-1);
}
public int[] quicksort(int numeros[],int izq,int der)
{
if(izq>=der)
return numeros;
int i=izq,d=der;
if(izq!=der)
{
int pivote;
int aux;
pivote = izq;
while(izq!=der)
{imprimeArreglo(numeros);
while(numeros[der]>=numeros[pivote] && izq der--;
while(numeros[izq] izq++;
if(der!=izq)
{
aux = numeros[der];
numeros[der]= numeros[izq];
numeros[izq]=aux;}
}
if(izq==der){
quicksort(numeros,i,izq-1);
quicksort(numeros,izq+1,d);
}
}
else
return numeros;
return numeros;
}
public void imprimeArreglo(int arreglo[])
{
String imp="";
for(int i=0;i {
if(i!=arreglo.length-1)
imp=imp+arreglo[i]+",";
else
imp=imp+arreglo[i]+"";
}
System.out.println(imp);
}
public static void main(String[] args) {
int array[] ={4,2,5,7,6,1,3};
Ordenador a = new Ordenador();
a.quicksort(array);
}
}
El ordenamiento rápido (quicksort en inglés) es un algoritmo creado por el científico británico en computación C. A. R. Hoare basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.
Uploaded with ImageShack.us
Codigo QuickSort:
package quicksort;
public class Ordenador {
public int[] quicksort(int numeros[])
{
return quicksort(numeros,0,numeros.length-1);
}
public int[] quicksort(int numeros[],int izq,int der)
{
if(izq>=der)
return numeros;
int i=izq,d=der;
if(izq!=der)
{
int pivote;
int aux;
pivote = izq;
while(izq!=der)
{imprimeArreglo(numeros);
while(numeros[der]>=numeros[pivote] && izq der--;
while(numeros[izq] izq++;
if(der!=izq)
{
aux = numeros[der];
numeros[der]= numeros[izq];
numeros[izq]=aux;}
}
if(izq==der){
quicksort(numeros,i,izq-1);
quicksort(numeros,izq+1,d);
}
}
else
return numeros;
return numeros;
}
public void imprimeArreglo(int arreglo[])
{
String imp="";
for(int i=0;i {
if(i!=arreglo.length-1)
imp=imp+arreglo[i]+",";
else
imp=imp+arreglo[i]+"";
}
System.out.println(imp);
}
public static void main(String[] args) {
int array[] ={4,2,5,7,6,1,3};
Ordenador a = new Ordenador();
a.quicksort(array);
}
}
Ordenamiento
ShellSort:
El ordenamiento Shell (Shell sort en inglés) es un algoritmo de ordenamiento. El método se denomina Shell en honor de su inventor Donald Shell. Su implementación original, requiere O(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en el libro de V. Pratt produce una implementación con un rendimiento de O(n log2 n) en el peor caso. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log n). Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo, es muy difícil analizar su tiempo de ejecución.
El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta dos observaciones:
1.El ordenamiento por inserción es eficiente si la entrada está "casi ordenada".
2.El ordenamiento por inserción es ineficiente, en general, porque mueve los valores sólo una posición cada vez.
El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del vector están casi ordenados.
Uploaded with ImageShack.us
Codigo Shell Sort:
package equipo;
public class ShellSort
{
private long[] data;
private int len;
public ShellSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value)
{
data[len] = value;
len++;
}
public void display()
{
System.out.print("Datos:");
for (int j = 0; j < len; j++) System.out.print(data[j] + " "); System.out.println(""); } public void shellSort() { int inner, outer; long temp; //find initial value of h int h = 1; while (h <= len / 3) h = h * 3 + 1; // (1, 4, 13, 40, 121, ...) while (h > 0) // decreasing h, until h=1
{
// h-sort the file
for (outer = h; outer < len; outer++) { temp = data[outer]; inner = outer; // one subpass (eg 0, 4, 8) while (inner > h - 1 && data[inner - h] >= temp)
{
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1) / 3; // decrease h
}
}
public static void main(String[] args)
{
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
for (int j = 0; j < maxSize; j++)
{
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
System.out.println("Datos no Ordenados");
arr.display();
arr.shellSort();
arr.display();
}
}
El ordenamiento Shell (Shell sort en inglés) es un algoritmo de ordenamiento. El método se denomina Shell en honor de su inventor Donald Shell. Su implementación original, requiere O(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en el libro de V. Pratt produce una implementación con un rendimiento de O(n log2 n) en el peor caso. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el óptimo O(n log n). Aunque es fácil desarrollar un sentido intuitivo de cómo funciona este algoritmo, es muy difícil analizar su tiempo de ejecución.
El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta dos observaciones:
1.El ordenamiento por inserción es eficiente si la entrada está "casi ordenada".
2.El ordenamiento por inserción es ineficiente, en general, porque mueve los valores sólo una posición cada vez.
El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del vector están casi ordenados.
Uploaded with ImageShack.us
Codigo Shell Sort:
package equipo;
public class ShellSort
{
private long[] data;
private int len;
public ShellSort(int max) {
data = new long[max];
len = 0;
}
public void insert(long value)
{
data[len] = value;
len++;
}
public void display()
{
System.out.print("Datos:");
for (int j = 0; j < len; j++) System.out.print(data[j] + " "); System.out.println(""); } public void shellSort() { int inner, outer; long temp; //find initial value of h int h = 1; while (h <= len / 3) h = h * 3 + 1; // (1, 4, 13, 40, 121, ...) while (h > 0) // decreasing h, until h=1
{
// h-sort the file
for (outer = h; outer < len; outer++) { temp = data[outer]; inner = outer; // one subpass (eg 0, 4, 8) while (inner > h - 1 && data[inner - h] >= temp)
{
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1) / 3; // decrease h
}
}
public static void main(String[] args)
{
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
for (int j = 0; j < maxSize; j++)
{
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
System.out.println("Datos no Ordenados");
arr.display();
arr.shellSort();
arr.display();
}
}
Arboles (Informatica)
En ciencias de la informática, un árbol es una estructura de datos ampliamente usada que imita la forma de un árbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el árbol y puede tener cero o más nodos hijos conectados a él. Se dice que un nodo a es padre de un nodo b si existe un enlace desde a hasta b (en ese caso, también decimos que b es hijo de a). Sólo puede haber un único nodo sin padres, que llamaremos raíz. Un nodo que no tiene hijos se conoce como hoja. Los demás nodos (tienen padre y uno o varios hijos) se les conoce como rama.
DefiniciónFormalmente, podemos definir un árbol de la siguiente forma:
Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).
Un nuevo árbol a partir de un nodo nr y k árboles de raíces con elementos cada uno, puede construirse estableciendo una relación padre-hijo entre nr y cada una de las raíces de los k árboles. El árbol resultante de nodos tiene como raíz el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja está formado por la unión de los k conjuntos hojas iniciales. A cada uno de los árboles Ai se les denota ahora subárboles de la raíz.
Una sucesión de nodos del árbol, de forma que entre cada dos nodos consecutivos de la sucesión haya una relación de parentesco, decimos que es un recorrido árbol. Existen dos recorridos típicos para listar los nodos de un árbol: primero en profundidad y primero en anchura. En el primer caso, se listan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo anterior probando por el siguiente hijo y así sucesivamente. En el segundo, por su parte, antes de listar los nodos de nivel n + 1 (a distancia n + 1 aristas de la raíz), se deben haber listado todos los de nivel n. Otros recorridos típicos del árbol son preorden, postorden e inorden:
El recorrido en preorden, también llamado orden previo consiste en recorrer en primer lugar la raíz y luego cada uno de los hijos en orden previo.
El recorrido en inorden, también llamado orden simétrico (aunque este nombre sólo cobra significado en los árboles binarios) consiste en recorrer en primer lugar A1, luego la raíz y luego cada uno de los hijos en orden simétrico.
El recorrido en postorden, también llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos en orden posterior y por último la raíz.
Finalmente, puede decirse que esta estructura es una representación del concepto de árbol en teoría de grafos. Un árbol es un grafo conexo y acíclico.
Uploaded with ImageShack.us
DefiniciónFormalmente, podemos definir un árbol de la siguiente forma:
Caso base: un árbol con sólo un nodo (es a la vez raíz del árbol y hoja).
Un nuevo árbol a partir de un nodo nr y k árboles de raíces con elementos cada uno, puede construirse estableciendo una relación padre-hijo entre nr y cada una de las raíces de los k árboles. El árbol resultante de nodos tiene como raíz el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja está formado por la unión de los k conjuntos hojas iniciales. A cada uno de los árboles Ai se les denota ahora subárboles de la raíz.
Una sucesión de nodos del árbol, de forma que entre cada dos nodos consecutivos de la sucesión haya una relación de parentesco, decimos que es un recorrido árbol. Existen dos recorridos típicos para listar los nodos de un árbol: primero en profundidad y primero en anchura. En el primer caso, se listan los nodos expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al nodo anterior probando por el siguiente hijo y así sucesivamente. En el segundo, por su parte, antes de listar los nodos de nivel n + 1 (a distancia n + 1 aristas de la raíz), se deben haber listado todos los de nivel n. Otros recorridos típicos del árbol son preorden, postorden e inorden:
El recorrido en preorden, también llamado orden previo consiste en recorrer en primer lugar la raíz y luego cada uno de los hijos en orden previo.
El recorrido en inorden, también llamado orden simétrico (aunque este nombre sólo cobra significado en los árboles binarios) consiste en recorrer en primer lugar A1, luego la raíz y luego cada uno de los hijos en orden simétrico.
El recorrido en postorden, también llamado orden posterior consiste en recorrer en primer lugar cada uno de los hijos en orden posterior y por último la raíz.
Finalmente, puede decirse que esta estructura es una representación del concepto de árbol en teoría de grafos. Un árbol es un grafo conexo y acíclico.
Uploaded with ImageShack.us
Tipos Arboles
**Arbol Binario
En ciencias de la computación, un árbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los árboles binarios son los árboles binarios de búsqueda, los montículos binarios y Codificación de Huffman.
Uploaded with ImageShack.us
En ciencias de la computación, un árbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como referencia a null, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de los árboles binarios son los árboles binarios de búsqueda, los montículos binarios y Codificación de Huffman.
Uploaded with ImageShack.us
Recorridos
Recorrido en preorden
En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierda, nodo derecha.
En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
void preorden(tArbol *a)
{
if (a != NULL) {
tratar(a); //Realiza una operación en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}
Recorrido en postorden
En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda, nodo derecha, nodo raiz. En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.
void postorden(tArbol *a)
{
if (a != NULL) {
postorden(a->hIzquiedo);
postorden(a->hDerecho);
tratar(a); //Realiza una operación en nodo
}
}
Recorrido en inorden
En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 9, 4.
Esquema de implementación:
void inorden(tArbol *a)
{
if (a != NULL) {
inorden(a->hIzquierdo);
tratar(a); //Realiza una operación en nodo
inorden(a->hDerecho);
}
}
En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierda, nodo derecha.
En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
void preorden(tArbol *a)
{
if (a != NULL) {
tratar(a); //Realiza una operación en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}
Recorrido en postorden
En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda, nodo derecha, nodo raiz. En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.
void postorden(tArbol *a)
{
if (a != NULL) {
postorden(a->hIzquiedo);
postorden(a->hDerecho);
tratar(a); //Realiza una operación en nodo
}
}
Recorrido en inorden
En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo izquierda,nodo raiz,nodo derecha. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 9, 4.
Esquema de implementación:
void inorden(tArbol *a)
{
if (a != NULL) {
inorden(a->hIzquierdo);
tratar(a); //Realiza una operación en nodo
inorden(a->hDerecho);
}
}
Bosques
Un bosque es una unión disjunta de árboles. Un árbol a veces recibe el nombre de árbol libre.
Uploaded with ImageShack.us
Uploaded with ImageShack.us
Programa Arboles
package javaapplication3; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.tree.*; import java.util.*; public class SimpleTree { public static void main(String[] args) { JFrame frame = new SimpleTreeFrame(); frame.show(); } } class SimpleTreeFrame extends JFrame { DefaultMutableTreeNode root = new DefaultMutableTreeNode("Mundo"); DefaultMutableTreeNode arge = new DefaultMutableTreeNode("Argentina"); DefaultMutableTreeNode sant = new DefaultMutableTreeNode("Santa Fe"); DefaultMutableTreeNode rafa = new DefaultMutableTreeNode("Rafaela"); DefaultMutableTreeNode rosa = new DefaultMutableTreeNode("Rosario"); DefaultMutableTreeNode safe = new DefaultMutableTreeNode("Santa Fe"); DefaultMutableTreeNode vena = new DefaultMutableTreeNode("Venado Tuerto"); DefaultMutableTreeNode vill = new DefaultMutableTreeNode("Villa Constitucion"); DefaultMutableTreeNode cord = new DefaultMutableTreeNode("Cordoba"); DefaultMutableTreeNode codo = new DefaultMutableTreeNode("Cordoba"); DefaultMutableTreeNode cbro = new DefaultMutableTreeNode("Cura Brochero"); DefaultMutableTreeNode rcua = new DefaultMutableTreeNode("Rio Cuarto"); DefaultMutableTreeNode chac = new DefaultMutableTreeNode("Chaco"); DefaultMutableTreeNode resi = new DefaultMutableTreeNode("Resistencia"); DefaultMutableTreeNode vang = new DefaultMutableTreeNode("Villa Angela"); DefaultMutableTreeNode chil = new DefaultMutableTreeNode("Chile"); DefaultMutableTreeNode regi = new DefaultMutableTreeNode("Region Metropolitana"); DefaultMutableTreeNode schi = new DefaultMutableTreeNode("Santiago de Chile"); public SimpleTreeFrame() { setTitle("SimpleTree"); setSize(300, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } } ); root.add(arge); // Enlazado de nodos arge.add(sant); // Enlazado de nodos sant.add(rafa); // Enlazado de nodos sant.add(rosa); // Enlazado de nodos sant.add(safe); // Enlazado de nodos sant.add(vena); // Enlazado de nodos sant.add(vill); // Enlazado de nodos arge.add(cord); // Enlazado de nodos
cord.add(codo); // Enlazado de nodos cord.add(cbro); // Enlazado de nodos cord.add(rcua); // Enlazado de nodos arge.add(chac); // Enlazado de nodos chac.add(resi); // Enlazado de nodos chac.add(vang); // Enlazado de nodos root.add(chil); // Enlazado de nodos chil.add(regi); // Enlazado de nodos regi.add(schi); // Enlazado de nodos JTree tree = new JTree(root); Container contentPane = getContentPane(); contentPane.add(new JScrollPane(tree)); Enumeration hijos = sant.children(); // Enumeracion de hijos while ( hijos.hasMoreElements() ) // Enumeracion de hijos { // Enumeracion de hijos System.err.println("Hijos de Santa Fe : "+hijos.nextElement()); // Enumeracion de hijos } // Enumeracion de hijos boolean hoja = vena.isLeaf(); // Consulta Hoja System.err.println("Es Venado Tuerto hoja : "+hoja); // Consulta Hoja Enumeration breadth = root.breadthFirstEnumeration(); // Enumeracion Nodos while ( breadth.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Breadth First : "+breadth.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration depth = root.depthFirstEnumeration(); // Enumeracion Nodos while ( depth.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Depth First : "+depth.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration preorder = root.preorderEnumeration(); // Enumeracion Nodos while ( preorder.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Pre Order : "+preorder.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration postorder = root.postorderEnumeration(); // Enumeracion Nodos while ( postorder.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Post Order : "+postorder.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos
}
}
cord.add(codo); // Enlazado de nodos cord.add(cbro); // Enlazado de nodos cord.add(rcua); // Enlazado de nodos arge.add(chac); // Enlazado de nodos chac.add(resi); // Enlazado de nodos chac.add(vang); // Enlazado de nodos root.add(chil); // Enlazado de nodos chil.add(regi); // Enlazado de nodos regi.add(schi); // Enlazado de nodos JTree tree = new JTree(root); Container contentPane = getContentPane(); contentPane.add(new JScrollPane(tree)); Enumeration hijos = sant.children(); // Enumeracion de hijos while ( hijos.hasMoreElements() ) // Enumeracion de hijos { // Enumeracion de hijos System.err.println("Hijos de Santa Fe : "+hijos.nextElement()); // Enumeracion de hijos } // Enumeracion de hijos boolean hoja = vena.isLeaf(); // Consulta Hoja System.err.println("Es Venado Tuerto hoja : "+hoja); // Consulta Hoja Enumeration breadth = root.breadthFirstEnumeration(); // Enumeracion Nodos while ( breadth.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Breadth First : "+breadth.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration depth = root.depthFirstEnumeration(); // Enumeracion Nodos while ( depth.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Depth First : "+depth.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration preorder = root.preorderEnumeration(); // Enumeracion Nodos while ( preorder.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Pre Order : "+preorder.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos Enumeration postorder = root.postorderEnumeration(); // Enumeracion Nodos while ( postorder.hasMoreElements() ) // Enumeracion Nodos { // Enumeracion Nodos System.err.println("Post Order : "+postorder.nextElement()); // Enumeracion Nodos } // Enumeracion Nodos
}
}
Teoria Grafos
En matemáticas y en ciencias de la computación, la teoría de grafos (también llamada teoría de las gráficas) estudia las propiedades de los grafos (también llamadas gráficas). Un grafo es un conjunto, no vacío, de objetos llamados vértices (o nodos) y una selección de pares de vértices, llamados aristas (edges en inglés) que pueden ser orientados o no. Típicamente, un grafo se representa mediante una serie de puntos (los vértices) conectados por líneas (las aristas).
Definiciones
Vértice
Artículo principal: Vértice (teoría de grafos)
Los vértices constituyen uno de los dos elementos que forman un grafo. Como ocurre con el resto de las ramas de las matemáticas, a la Teoría de Grafos no le interesa saber qué son los vértices.
Diferentes situaciones en las que pueden identificarse objetos y relaciones que satisfagan la definición de grafo pueden verse como grafos y así aplicar la Teoría de Grafos en ellos.
Uploaded with ImageShack.us
Grafo
Artículo principal: Grafo
En la figura, V = { a, b, c, d, e, f }, y A = { ab, ac, ae, bc, bd, df, ef }.Un grafo es una pareja de conjuntos G = (V,A), donde V es el conjunto de vértices, y A es el conjunto de aristas, este último es un conjunto de pares de la forma (u,v) tal que . Para simplificar, notaremos la arista (a,b) como ab.
En teoría de grafos, sólo queda lo esencial del dibujo: la forma de las aristas no son relevantes, sólo importa a qué vértices están unidas. La posición de los vértices tampoco importa, y se puede variar para obtener un dibujo más claro.
Muchas redes de uso cotidiano pueden ser modeladas con un grafo: una red de carreteras que conecta ciudades, una red eléctrica o la red de drenaje de una ciudad.
Uploaded with ImageShack.us
Subgrafo
Un subgrafo de un grafo G es un grafo cuyos conjuntos de vértices y aristas son subconjuntos de los de G. Se dice que un grafo G contiene a otro grafo H si algún subgrafo de G es H o es isomorfo a H (dependiendo de las necesidades de la situación).
El subgrafo inducido de G es un subgrafo G' de G tal que contiene todas las aristas adyacentes al subconjunto de vértices de G.
Definición:
Sea G=(V, A). G’=(V’,A’) se dice subgrafo de G si:
1- V’ V
2- A' A
3- (V’,A’) es un grafo
Si G’=(V’,A’) es subgrafo de G, para todo v G se cumple gr (G’,v)≤ gr (G, v)
G2 es un subgrafo de G.
Definiciones
Vértice
Artículo principal: Vértice (teoría de grafos)
Los vértices constituyen uno de los dos elementos que forman un grafo. Como ocurre con el resto de las ramas de las matemáticas, a la Teoría de Grafos no le interesa saber qué son los vértices.
Diferentes situaciones en las que pueden identificarse objetos y relaciones que satisfagan la definición de grafo pueden verse como grafos y así aplicar la Teoría de Grafos en ellos.
Uploaded with ImageShack.us
Grafo
Artículo principal: Grafo
En la figura, V = { a, b, c, d, e, f }, y A = { ab, ac, ae, bc, bd, df, ef }.Un grafo es una pareja de conjuntos G = (V,A), donde V es el conjunto de vértices, y A es el conjunto de aristas, este último es un conjunto de pares de la forma (u,v) tal que . Para simplificar, notaremos la arista (a,b) como ab.
En teoría de grafos, sólo queda lo esencial del dibujo: la forma de las aristas no son relevantes, sólo importa a qué vértices están unidas. La posición de los vértices tampoco importa, y se puede variar para obtener un dibujo más claro.
Muchas redes de uso cotidiano pueden ser modeladas con un grafo: una red de carreteras que conecta ciudades, una red eléctrica o la red de drenaje de una ciudad.
Uploaded with ImageShack.us
Subgrafo
Un subgrafo de un grafo G es un grafo cuyos conjuntos de vértices y aristas son subconjuntos de los de G. Se dice que un grafo G contiene a otro grafo H si algún subgrafo de G es H o es isomorfo a H (dependiendo de las necesidades de la situación).
El subgrafo inducido de G es un subgrafo G' de G tal que contiene todas las aristas adyacentes al subconjunto de vértices de G.
Definición:
Sea G=(V, A). G’=(V’,A’) se dice subgrafo de G si:
1- V’ V
2- A' A
3- (V’,A’) es un grafo
Si G’=(V’,A’) es subgrafo de G, para todo v G se cumple gr (G’,v)≤ gr (G, v)
G2 es un subgrafo de G.
Pilas
Una pila (stack en inglés) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del inglés Last In First Out, último en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el área de informática debido a su simplicidad y ordenación implícita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo.
Pila Estatica
Es un arreglo el cual ya contiene un valor determinado.
Pila Dinamica
Es un dato el cual puedes modificar al gusto para tu necesidad.
*Operaciones
Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar, a las que en las implementaciones modernas de las pilas se suelen añadir más de uso habitual.
Crear: se crea la pila vacía.
Apilar: se añade un elemento a la pila.(push)
Desapilar: se elimina el elemento frontal de la pila.(pop)
Cima: devuelve el elemento que esta en la cima de la pila. (top o peek)
Vacía: devuelve cierto si la pila está vacía o falso en caso contrario.
*Aplicaciones
Las pilas suelen emplearse en los siguientes contextos:
Evaluación de expresiones en notación postfija (notación polaca inversa).
Reconocedores sintácticos de lenguajes independientes del contexto
Implementación de recursividad.
Para el manejo de los datos se cuenta con dos operaciones básicas: apilar (push), que coloca un objeto en la pila, y su operación inversa, retirar (o desapilar, pop), que retira el último elemento apilado.
En cada momento sólo se tiene acceso a la parte superior de la pila, es decir, al último objeto apilado (denominado TOS, Top of Stack en inglés). La operación retirar permite la obtención de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS.
Por analogía con objetos cotidianos, una operación apilar equivaldría a colocar un plato sobre una pila de platos, y una operación retirar a retirarlo.
Pila Estatica
Es un arreglo el cual ya contiene un valor determinado.
Pila Dinamica
Es un dato el cual puedes modificar al gusto para tu necesidad.
*Operaciones
Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar, a las que en las implementaciones modernas de las pilas se suelen añadir más de uso habitual.
Crear: se crea la pila vacía.
Apilar: se añade un elemento a la pila.(push)
Desapilar: se elimina el elemento frontal de la pila.(pop)
Cima: devuelve el elemento que esta en la cima de la pila. (top o peek)
Vacía: devuelve cierto si la pila está vacía o falso en caso contrario.
*Aplicaciones
Las pilas suelen emplearse en los siguientes contextos:
Evaluación de expresiones en notación postfija (notación polaca inversa).
Reconocedores sintácticos de lenguajes independientes del contexto
Implementación de recursividad.
Programa
Pila Estatica
public class Pila
{
private int vec[];
private int tope, tamano;
public Pila( int tamano_p)//tamano de la pila parametro constructor
{
if( tamano_p < 0)
{
tamano = 0;
System.err.println("Error");
}//fin if
else
{
vec = new int[ tamano_p ];
tamano = tamano_p;
tope = -1;
}//fin else
}
//para saber si la pila esta vacia
public boolean vacia()
{
if(tope == -1)
return true;
return false;
}
//Devuelva true si logra insertar elemento
public boolean inserta(int valor)
{
//si ya no hay espacio...
if( tope == tamano-1 )
{
System.err.println("OverFloat");
return false;
}
else
{
vec [ ++tope ] = valor;
System.out.println("Agregado correctamente");
return true;
}
}
//devuelve el valor de la cima de la pila
public int tope()
{
//si la pila esta vacia...
if( vacia() )
{
System.err.println("La pila esta vacia");
//si la pila esta vacia se retorna un 0 ... solo por ejemplo
return 0;
}
else
{
return vec[ tope-- ];
}
}
//limpia la pila
public void vaciar()
{
tope = -1;
}
}
public class Pila
{
private int vec[];
private int tope, tamano;
public Pila( int tamano_p)//tamano de la pila parametro constructor
{
if( tamano_p < 0)
{
tamano = 0;
System.err.println("Error");
}//fin if
else
{
vec = new int[ tamano_p ];
tamano = tamano_p;
tope = -1;
}//fin else
}
//para saber si la pila esta vacia
public boolean vacia()
{
if(tope == -1)
return true;
return false;
}
//Devuelva true si logra insertar elemento
public boolean inserta(int valor)
{
//si ya no hay espacio...
if( tope == tamano-1 )
{
System.err.println("OverFloat");
return false;
}
else
{
vec [ ++tope ] = valor;
System.out.println("Agregado correctamente");
return true;
}
}
//devuelve el valor de la cima de la pila
public int tope()
{
//si la pila esta vacia...
if( vacia() )
{
System.err.println("La pila esta vacia");
//si la pila esta vacia se retorna un 0 ... solo por ejemplo
return 0;
}
else
{
return vec[ tope-- ];
}
}
//limpia la pila
public void vaciar()
{
tope = -1;
}
}
Programa II
import java.util.*;
public class Main
{
public static void main(String[] args)
{
//Variables del Sistema
Pila MiPila = new Pila(); //Variable tipo pila
Scanner in=new Scanner(System.in);//Variable que lee desde teclado
int intOpc1,intOpc2;//Variables que contienen la opcion elegida por el usuario
try
{
//Cuerpo del Programa
do
{
//Menu del Sistema
System.out.print("---------------------------------------\n");
System.out.print(" Sistema Multipila\n");
System.out.print("---------------------------------------\n");
System.out.print("1. Agregar Pila\n");
System.out.print("2. Eliminar Pila\n");
System.out.print("3. Ver Ultima Pila Ingresada\n");
System.out.print("4. Salir\n\n");
System.out.print("Opcion: ");
//Lectura de la Opcion
intOpc1=in.nextInt();
//Filtramos Seleccion
switch(intOpc1)
{
//Caso Agregar Pila
case 1:System.out.print("Ingresa el Elemento de la Pila: ");
MiPila.push(in.next());
break;
//Caso Eliminar Pila
case 2:MiPila.pop();
break;
//Caso Ver Ultima Pila Registrada
case 3:System.out.print("Ultimo Dato ingresado en la Pila: "+MiPila.getData()+"\n");
break;
//Caso Salir
case 4:System.exit(0);
break;
//Caso Erroneo
default: System.out.print("Opcion incorrecta!\n");
}
}while(intOpc1!=4);
}
catch (Exception e)
{
System.err.println("\nWARNING: " + e.getMessage());
}
}
}
public class Main
{
public static void main(String[] args)
{
//Variables del Sistema
Pila MiPila = new Pila(); //Variable tipo pila
Scanner in=new Scanner(System.in);//Variable que lee desde teclado
int intOpc1,intOpc2;//Variables que contienen la opcion elegida por el usuario
try
{
//Cuerpo del Programa
do
{
//Menu del Sistema
System.out.print("---------------------------------------\n");
System.out.print(" Sistema Multipila\n");
System.out.print("---------------------------------------\n");
System.out.print("1. Agregar Pila\n");
System.out.print("2. Eliminar Pila\n");
System.out.print("3. Ver Ultima Pila Ingresada\n");
System.out.print("4. Salir\n\n");
System.out.print("Opcion: ");
//Lectura de la Opcion
intOpc1=in.nextInt();
//Filtramos Seleccion
switch(intOpc1)
{
//Caso Agregar Pila
case 1:System.out.print("Ingresa el Elemento de la Pila: ");
MiPila.push(in.next());
break;
//Caso Eliminar Pila
case 2:MiPila.pop();
break;
//Caso Ver Ultima Pila Registrada
case 3:System.out.print("Ultimo Dato ingresado en la Pila: "+MiPila.getData()+"\n");
break;
//Caso Salir
case 4:System.exit(0);
break;
//Caso Erroneo
default: System.out.print("Opcion incorrecta!\n");
}
}while(intOpc1!=4);
}
catch (Exception e)
{
System.err.println("\nWARNING: " + e.getMessage());
}
}
}
Programa III
public class Pila
{
//Atributos de la Clase
protected Object ArrDatos[];
//Constructor de la Clase
public Pila()
{
//Creamos el Arreglo de Elementos
ArrDatos=new Object[0];
}
//Metodos de la Clase
//->Determina si una pila esta vacia o no
private boolean isEmpty()
{
if(ArrDatos.length==0)
return true;
else
return false;
}
//->Redimensiona Pila
private void redim(boolean bolParametro)
{
Object ArrAux[];
//Filtramos el parametro de la funcion
if (bolParametro)
{
//Si es + creamos un arreglo auxiliar con un elemento mas
ArrAux=new Object[ArrDatos.length+1];
//Recorremos el arreglo de datos
for(int i=0;i //pasamos la informacion al Auxiliar
ArrAux[i]=ArrDatos[i];
}
else
{
//Si es - creamos un arreglo auxiliar con un elemento menos
ArrAux=new Object[ArrDatos.length-1];
//Recorremos el arreglo de datos
for(int i=0;i //pasamos la informacion al Auxiliar
ArrAux[i]=ArrDatos[i];
}
//Redimensionamos el Arreglo de Datos al tamaño final
ArrDatos=new Object[ArrAux.length];
//Pasamos toda la informacion del Auxiliar al Original
ArrDatos=ArrAux;
}
//->Agrega elemento a Pila
public void push(Object ObjDato)
{
//Redimensionamos el Arreglo
redim(true);
//Ingresamos elemento a pila
ArrDatos[ArrDatos.length-1]=ObjDato;
}
//->Elimina elemento a Pila
public void pop()
{
//Revisamos estado de la Pila
if (!isEmpty())
//Si contiene elementos Redimensionamos la Pila
redim(false);
else
//Si esta vacia generamos una Excepción
throw new RuntimeException("Pila Vacia...");
}
//->Obtiene dato de Pila
public Object getData()
{
//Revisamos estado de la Pila
if(!isEmpty())
//Si contiene elementos mandamos el dato
return(ArrDatos[ArrDatos.length-1]);
else
//Si esta vacia generamos una Excepción
throw new RuntimeException("Pila Vacia...");
}
}
{
//Atributos de la Clase
protected Object ArrDatos[];
//Constructor de la Clase
public Pila()
{
//Creamos el Arreglo de Elementos
ArrDatos=new Object[0];
}
//Metodos de la Clase
//->Determina si una pila esta vacia o no
private boolean isEmpty()
{
if(ArrDatos.length==0)
return true;
else
return false;
}
//->Redimensiona Pila
private void redim(boolean bolParametro)
{
Object ArrAux[];
//Filtramos el parametro de la funcion
if (bolParametro)
{
//Si es + creamos un arreglo auxiliar con un elemento mas
ArrAux=new Object[ArrDatos.length+1];
//Recorremos el arreglo de datos
for(int i=0;i //pasamos la informacion al Auxiliar
ArrAux[i]=ArrDatos[i];
}
else
{
//Si es - creamos un arreglo auxiliar con un elemento menos
ArrAux=new Object[ArrDatos.length-1];
//Recorremos el arreglo de datos
for(int i=0;i //pasamos la informacion al Auxiliar
ArrAux[i]=ArrDatos[i];
}
//Redimensionamos el Arreglo de Datos al tamaño final
ArrDatos=new Object[ArrAux.length];
//Pasamos toda la informacion del Auxiliar al Original
ArrDatos=ArrAux;
}
//->Agrega elemento a Pila
public void push(Object ObjDato)
{
//Redimensionamos el Arreglo
redim(true);
//Ingresamos elemento a pila
ArrDatos[ArrDatos.length-1]=ObjDato;
}
//->Elimina elemento a Pila
public void pop()
{
//Revisamos estado de la Pila
if (!isEmpty())
//Si contiene elementos Redimensionamos la Pila
redim(false);
else
//Si esta vacia generamos una Excepción
throw new RuntimeException("Pila Vacia...");
}
//->Obtiene dato de Pila
public Object getData()
{
//Revisamos estado de la Pila
if(!isEmpty())
//Si contiene elementos mandamos el dato
return(ArrDatos[ArrDatos.length-1]);
else
//Si esta vacia generamos una Excepción
throw new RuntimeException("Pila Vacia...");
}
}
Suscribirse a:
Enviar comentarios (Atom)
Java
Conceptos
Listas Enlazadas.-
En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los array convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.
Lista Simple.-
La lista enlazada básica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo.
Listas Dobles.-
Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL si es el primer nodo; y otro que apunta al nodo siguiente, o apunta al valor NULL si es el último nodo.
Listas Circulares.-
En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer una lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.
En Ciencias de la Computación, una lista enlazada es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de datos arbitrarios y una o dos referencias (punteros) al nodo anterior o posterior. El principal beneficio de las listas enlazadas respecto a los array convencionales es que el orden de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.
Lista Simple.-
La lista enlazada básica es la lista enlazada simple la cual tiene un enlace por nodo. Este enlace apunta al siguiente nodo en la lista, o al valor NULL o a la lista vacía, si es el último nodo.
Listas Dobles.-
Un tipo de lista enlazada más sofisticado es la lista doblemente enlazada o lista enlazadas de dos vías. Cada nodo tiene dos enlaces: uno apunta al nodo anterior, o apunta al valor NULL si es el primer nodo; y otro que apunta al nodo siguiente, o apunta al valor NULL si es el último nodo.
Listas Circulares.-
En una lista enlazada circular, el primer y el último nodo están unidos juntos. Esto se puede hacer tanto para listas enlazadas simples como para las doblemente enlazadas. Para recorrer una lista enlazada circular podemos empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los nodos de una lista a partir de uno dado.
Operaciones
Las operaciones que podemos realizar sobre una lista enlazada son las siguientes:
Recorrido. Esta operación consiste en visitar cada uno de los nodos que forman la lista . Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dará la dirección del tercer nodo, y así sucesivamente.
Inserción. Esta operación consiste en agregar un nuevo nodo a la lista. Para esta operación se pueden considerar tres casos:
Insertar un nodo al inicio.
Insertar un nodo antes o después de cierto nodo.
Insertar un nodo al final.
Borrado. La operación de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos:
Eliminar el primer nodo.
Eliminar el último nodo.
Eliminar un nodo con cierta información.
Eliminar el nodo anterior o posterior al nodo cierta con información.
Búsqueda. Esta operación consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar.
Recorrido. Esta operación consiste en visitar cada uno de los nodos que forman la lista . Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dará la dirección del tercer nodo, y así sucesivamente.
Inserción. Esta operación consiste en agregar un nuevo nodo a la lista. Para esta operación se pueden considerar tres casos:
Insertar un nodo al inicio.
Insertar un nodo antes o después de cierto nodo.
Insertar un nodo al final.
Borrado. La operación de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos:
Eliminar el primer nodo.
Eliminar el último nodo.
Eliminar un nodo con cierta información.
Eliminar el nodo anterior o posterior al nodo cierta con información.
Búsqueda. Esta operación consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar.
Programa de Listas
import java.util.*;
public class Listas {
public static void main (String Args []){
Scanner leer = new Scanner (System.in);
int num;
int op;
LinkedList lista = new LinkedList();
do{
System.out.println("\t Menu\t");
System.out.println("Operaciones con listas");
System.out.println("1.- Insertar al principio");
System.out.println("2.- Insertar al final");
System.out.println("3.-Borrar al principio");
System.out.println("4.-Borrar al final");
System.out.println("5.-Mostrar la lista");
System.out.println("6.-Borrar toda la lista");
System.out.println("7.-Salir");
System.out.println("\n");
System.out.println("Elija la operacion que desee");
op = leer.nextInt();
switch(op){
case 1:
System.out.println("Inserte un numero");
num = leer.nextInt();
lista.addFirst(num);
break;
case 2:
System.out.println("Inserte numero");
num = leer.nextInt();
lista.addLast(num);
break;
case 3:
System.out.println("Se borrara el primer nodo");
lista.removeFirst();
break;
case 4:
System.out.println("Se borra el nodo final");
lista.removeLast();
break;
case 5:
System.out.println("La lista es la siguiente");
List lista2 = new ArrayList(lista);
Iterator it= lista2.iterator();
while (it.hasNext()){
System.out.println(it.next()+"");
}
break;
case 6:
System.out.println("Se borraran todos los elementos de la lista");
lista.clear();
break;
case 7:
System.out.println("Al rato");
break;
}
}
while (op !=7){
}
}
}
public class Listas {
public static void main (String Args []){
Scanner leer = new Scanner (System.in);
int num;
int op;
LinkedList lista = new LinkedList();
do{
System.out.println("\t Menu\t");
System.out.println("Operaciones con listas");
System.out.println("1.- Insertar al principio");
System.out.println("2.- Insertar al final");
System.out.println("3.-Borrar al principio");
System.out.println("4.-Borrar al final");
System.out.println("5.-Mostrar la lista");
System.out.println("6.-Borrar toda la lista");
System.out.println("7.-Salir");
System.out.println("\n");
System.out.println("Elija la operacion que desee");
op = leer.nextInt();
switch(op){
case 1:
System.out.println("Inserte un numero");
num = leer.nextInt();
lista.addFirst(num);
break;
case 2:
System.out.println("Inserte numero");
num = leer.nextInt();
lista.addLast(num);
break;
case 3:
System.out.println("Se borrara el primer nodo");
lista.removeFirst();
break;
case 4:
System.out.println("Se borra el nodo final");
lista.removeLast();
break;
case 5:
System.out.println("La lista es la siguiente");
List lista2 = new ArrayList(lista);
Iterator it= lista2.iterator();
while (it.hasNext()){
System.out.println(it.next()+"");
}
break;
case 6:
System.out.println("Se borraran todos los elementos de la lista");
lista.clear();
break;
case 7:
System.out.println("Al rato");
break;
}
}
while (op !=7){
}
}
}
Bibliografia
Libro:
Estructuras de datos con Java : diseño de estructuras y algoritmos/ Lewis, John; Chase, Joseph; S. L., Vuelapluma; Martín-Romo, Miguel.
wikipedia.com
wikilibro.com
Estructuras de datos con Java : diseño de estructuras y algoritmos/ Lewis, John; Chase, Joseph; S. L., Vuelapluma; Martín-Romo, Miguel.
wikipedia.com
wikilibro.com
No hay comentarios:
Publicar un comentario