miércoles, 23 de noviembre de 2011

Busqueda

Es el proceso de encontrar un elemento especifico de un array tecnincas de busqueda: secuencial y binaria
es necesario que los datos esten ordenados por algun algoritmo
BUSQUEDA SECUENCIAL
Está diseñada 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.
  • Se utiliza cuando algún elemento no está ordenado o no puede ser ordenado previamente.
  • Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del arreglo hasta encontrarlo, o hasta que se llegue al final.
  • La existencia se puede asegurar cuando el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo .
VENTAJAS Y DESVENTAJAS
  • DESVENTAJA.- en un vector de N posiciones este algoritmo va a buscar posición a posición hasta dar con el dato solicitado y en el caso de que no exista pues también va a recorrer todo el arreglo.
  • VENTAJA.- Lo bueno de este tipo de búsqueda es que es muy sencillo de implementar.

CODIGO


["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<VectorNombres.length;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 BINARIA
Se situa la lectura en el centro de la lista y se comprueba se la clave coincide con el valor del elemento central.
si no se encuentra el valor de la clave se situa en la mitad inferior o superior del elemento central de la lista

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.

Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a dividir está vacio {}, el elemento no se encuentra en el array.




 

jueves, 10 de noviembre de 2011

GRAFOS

CONCEPTO
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 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).
Un vértice o nodo es la unidad fundamental de la que están formados los grafos. Un grafo no dirigido está formado por un conjunto de vértices y un conjunto de aristas mientras que un grafo dirigido está compuesto por un conjunto de vértices y un conjunto de arcos. En este contexto, los vértices son tratados como objetos indivisibles y sin propiedades, aunque puedan tener una estructura adicional dependiendo de la aplicación por la cual se usa el grafo.
GRAFO CON 6 VERTICES Y 7 ARISTAS

CAMINO
Un camino en un grafo es una sucesión finita en la que aparecen alternadamente vértices y aristas de dicho grafo. Otras definiciones básicas son:

Los extremos son los vértices inicial y final del camino.
La longitud de un camino es el numero de aristas que contiene.
Un camino es cerrado si sus extremos coinciden.
Un camino es simple si en la sucesión de vértices no hay ninguno repetido.
Un ciclo es un camino cerrado donde los únicos vértices repetidos son el primero y el ultimo.
Un circuito es un camino cerrado que no repite aristas.
Si en un grafo existe un camino que conecta dos vértices distintos, entonces existe un camino simple con extremos en dichos vértices.
Un grafo es conexo si para cada par de vértices, existe un camino con extremos en dichos vértices.



es un camino o circuito que contiene todas las aristas apareciendo cada una de ellas exactamente una vez. Un grafo que admite dicho circuito se denomina grafo euleriano, y sus vértices o tienen grado par o dos de los vértices tienen grado impar.
Camino euleriano:

es un camino simple que contiene todos los vértices apareciendo cada uno de ellos exactamente una vez. Un ciclo que a su vez es un camino hamiltoniano se denomina ciclo hamiltoniano, y un grafo que contiene un ciclo hamiltoniano se denomina grafo hamiltoniano
Camino hamiltoniano:

.

Tipos de caminos

Ordenamiento de datos

CONCEPTO
La ordenación de datos es un proceso muy frecuente en programación. Esta operación es también un proceso que las personas encuentran comúnmente en sus rutinas diarias.
Por ejemplo, cada elemento de la colección de datos de una agenda telefónica tiene un campo nombre, dirección, y un número de teléfono.

Cuando los datos están almacenados en vectores, tablas (arrays), listas enlazadas o árboles, la ordenación se denomina ordenación interna.

Cuando los datos a clasificar se encuentran almacenados en archivos, en soportes de almacenamiento masivo (cintas o discos)

TIPOS DE METODOS DE ORDENAMIENTO

ORDENAMIENTO POR BURBUJA
La idea básica de este método de ordenamiento es la de comparar pares de valores de llaves e intercambiarlos si no están en sus posiciones relativas correctas.
La idea de este método es la de permitir que cada llave flote a su posición adecuada a través de una serie de pares de comparaciones e intercambios con los valores adyacentes.

Cada paso haces que una llave suba a su posición final, como una burbuja, en la lista ordenada.
EJEMPLO GRAFICO DEL ORDENAMIENTO POR BURBUJA



QUICKSORT
El ordenamiento rápido  es un algoritmo que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n.

El algoritmo consta de los siguientes pasos:
  • Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
  • Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que él, y al otro los mayores.
  • La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
  • Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.
La eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.
  • En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos sublistas de igual tamaño. En este caso, el orden de complejidad del algoritmo es O(n·log n).
EJEMPLO GRAFICO DEL ORDENAMIENTO POR QUICKSORT

SHELL SORT
ordenamiento Shell es un algoritmo de ordenamiento.
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.
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.
EJEMPLO GRAFICO DE SHELL SORT

INSERCION
El ordenamiento por inserción es una manera muy natural de ordenar para un ser humano, y puede usarse fácilmente para ordenar un mazo de cartas numeradas en forma arbitraria.
Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Después, cuando hay k elementos ordenados de menor a mayor, se toma el elemento k+1 y se compara con todos los elementos ya ordenados, deteniéndose cuando se encuentra un elemento menor.
 En este punto se inserta el elemento k+1 debiendo desplazarse los demás elementos.
EJEMPLO GRAFICO DE ORDENAMIENTO POR INSERCION

AQUI ALGUNOS VIDEOS
                      

                    
                   

                    

miércoles, 9 de noviembre de 2011

Arboles

Definición
Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.
También se suele dar una definición recursiva: un árbol es una estructura en compuesta por un dato y varios árboles.
Esto son definiciones simples. Pero las características que implican no lo son tanto.

  • Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol. En el ejemplo, 'L' y 'M' son hijos de 'G'.
  • Nodo padre: nodo que contiene un puntero al nodo actual. En el ejemplo, el nodo 'A' es padre de 'B', 'C' y 'D'.
Los árboles con los que trabajaremos tienen otra característica importante: cada nodo sólo puede ser apuntado por otro nodo, es decir, cada nodo sólo tendrá un padre. Esto hace que estos árboles estén fuertemente jerarquizados, y es lo que en realidad les da la apariencia de árboles.
En cuanto a la posición dentro del árbol:
  • Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos al árbol. En el ejemplo, ese nodo es el 'A'.
  • Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'F', 'H', 'I', 'K', 'L', 'M', 'N' y 'O'.
  • Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no pertenecen a ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E', 'G' y 'J'.
Otra característica que normalmente tendrán nuestros árboles es que todos los nodos contengan el mismo número de punteros, es decir, usaremos la misma estructura para todos los nodos del árbol. Esto hace que la estructura sea más sencilla, y por lo tanto también los programas para trabajar con ellos.
Tampoco es necesario que todos los nodos hijos de un nodo concreto existan. Es decir, que pueden usarse todos, algunos o ninguno de los punteros de cada nodo.
Un árbol en el que en cada nodo o bien todos o ninguno de los hijos existe, se llama árbol completo.
En una cosa, los árboles se parecen al resto de las estructuras que hemos visto: dado un nodo cualquiera de la estructura, podemos considerarlo como una estructura independiente. Es decir, un nodo cualquiera puede ser considerado como la raíz de un árbol completo.
Existen otros conceptos que definen las características del árbol, en relación a su tamaño:
  • Orden: es el número potencial de hijos que puede tener cada elemento de árbol. De este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es de orden dos, si puede apuntar a tres será de orden tres, etc.
  • Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En el árbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y no existen elementos con más de tres hijos.
  • Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.
  • Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B' tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.
Los árboles de orden dos son bastante especiales, de hecho les dedicaremos varios capítulos. Estos árboles se conocen también como árboles binarios.
Frecuentemente, aunque tampoco es estrictamente necesario, para hacer más fácil moverse a través del árbol, añadiremos un puntero a cada nodo que apunte al nodo padre. De este modo podremos avanzar en dirección a la raíz, y no sólo hacia las hojas.
Es importante conservar siempre el nodo raíz ya que es el nodo a partir del cual se desarrolla el árbol, si perdemos este nodo, perderemos el acceso a todo el árbol.

RECORRIDOS
Esos recorridos dependen en gran medida del tipo y propósito del árbol, pero hay ciertos recorridos que usaremos frecuentemente. Se trata de aquellos recorridos que incluyen todo el árbol.

Hay tres formas de recorrer un árbol completo, y las tres se suelen implementar mediante recursividad. En los tres casos se sigue siempre a partir de cada nodo todas las ramas una por una.

Supongamos que tenemos un árbol de orden tres, y queremos recorrerlo por completo.
Partiremos del nodo raíz:
RecorrerArbol(raiz);
La función RecorrerArbol, aplicando recursividad, será tan sencilla como invocar de nuevo a la función RecorrerArbol para cada una de las ramas:
void RecorrerArbol(Arbol a) \{
   if(a == NULL) return;
   RecorrerArbol(a->rama[0]);
   RecorrerArbol(a->rama[1]);
   RecorrerArbol(a->rama[2]);
}
Lo que diferencia los distintos métodos de recorrer el árbol no es el sistema de hacerlo, sino el momento que elegimos para procesar el valor de cada nodo con relación a los recorridos de cada una de las ramas.

Árbol
Los tres tipos son:

Pre-orden

En este tipo de recorrido, el valor del nodo se procesa antes de recorrer las ramas:
void PreOrden(Arbol a) \{
   if(a == NULL) return;
   Procesar(dato);
   RecorrerArbol(a->rama[0]);
   RecorrerArbol(a->rama[1]);
   RecorrerArbol(a->rama[2]);
}
Si seguimos el árbol del ejemplo en pre-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo así:
A B E K F C G L M D H I J N O

In-orden

En este tipo de recorrido, el valor del nodo se procesa después de recorrer la primera rama y antes de recorrer la última. Esto tiene más sentido en el caso de árboles binarios, y también cuando existen ORDEN-1 datos, en cuyo caso procesaremos cada dato entre el recorrido de cada dos ramas (este es el caso de los árboles-b):
void InOrden(Arbol a) \{
   if(a == NULL) return;
   RecorrerArbol(a->rama[0]);
   Procesar(dato);
   RecorrerArbol(a->rama[1]);
   RecorrerArbol(a->rama[2]);
}
Si seguimos el árbol del ejemplo en in-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo así:
K E B F A L G M C H D I N J O

Post-orden

En este tipo de recorrido, el valor del nodo se procesa después de recorrer todas las ramas:
void PostOrden(Arbol a) \{
   if(a == NULL) return;
   RecorrerArbol(a->rama[0]);
   RecorrerArbol(a->rama[1]);
   RecorrerArbol(a->rama[2]);
   Procesar(dato);
}
Si seguimos el árbol del ejemplo en post-orden, y el proceso de los datos es sencillamente mostrarlos por pantalla, obtendremos algo así:
K E F B L M G C H I N O J D A
ELIMINAR NODOS
El proceso general es muy sencillo en este caso, pero con una importante limitación, sólo podemos borrar nodos hoja:
El proceso sería el siguiente:
  1. Buscar el nodo padre del que queremos eliminar.
  2. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar.
  3. Liberar el nodo.
  4. padre->nodo[i] = NULL;.
Cuando el nodo a borrar no sea un nodo hoja, diremos que hacemos una "poda", y en ese caso eliminaremos el árbol cuya raíz es el nodo a borrar. Se trata de un procedimiento recursivo, aplicamos el recorrido PostOrden, y el proceso será borrar el nodo.
El procedimiento es similar al de borrado de un nodo:
  1. Buscar el nodo padre del que queremos eliminar.
  2. Buscar el puntero del nodo padre que apunta al nodo que queremos borrar.
  3. Podar el árbol cuyo padre es nodo.
  4. padre->nodo[i] = NULL;.
En el árbol del ejemplo, para podar la rama 'B', recorreremos el subárbol 'B' en postorden, eliminando cada nodo cuando se procese, de este modo no perdemos los punteros a las ramas apuntadas por cada nodo, ya que esas ramas se borrarán antes de eliminar el nodo.
De modo que el orden en que se borrarán los nodos será:
K E F y B
 
 
PROGRAMA:
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    } }
 

lunes, 31 de octubre de 2011

Recursividad

Para empezar con lo que es la recursividad, sepamos primeramente que es, se trata mas que nada de un método que se mande a llamar a si mismo, ya sea una(Recursividad Simple) o mas veces(Recursividad Múltiple) haciendo un reemplazo de métodos directos como formulas que mas adelante les demostraré.

Ahora empezamos con algo sencillo, supongamos que queremos hacer una suma sucesiva del mismo número, la cuál esta operación equivaldrá a la multiplicación.

El método para realizar una multiplicación podría ser de la siguiente manera:


Como se dan cuenta ya mando valores estáticos de 2 y 5, mostrando como resultado 10 mandandolo de esa u otras formas similares, se supone de forma iterativa, ahora hagamoslo de multiplicación a suma sucesiva usando un ciclo FOR.


Pero esas dos fueron de forma Iterativa, ahora hagámonos de manera recursiva.

Para esto, es necesario entender que tenemos que hacer una idea sobre como funciona la recursiva,



un video:

sábado, 29 de octubre de 2011

programa de cola estatica

import java.util.Scanner;
/**
 *
 * @author omar
 */
public class Cola {

    private final int MAXIMO = 100;
    private int[] V;
    private int inicio;
    private int fin;

    public Cola() {
        this.V = new int[MAXIMO + 1];
        this.inicio = 0;
        this.fin = 0;
    }
    public boolean esVacia() {
        return inicio == fin;
    }
    public boolean esLlena() {
        return tamanio() == MAXIMO - 1;
    }
    public void agregar(int a) {
        if (esLlena()) {
            System.out.println("Cola Llena! No se puede adicionar.");
        } else {
            fin = (fin + 1) % MAXIMO;
            V[fin] = a;
        }
    }
    public int eliminar() {
        int a = Integer.MIN_VALUE;
        if (esVacia()) {
            System.out.println("Cola Vacia! No se puede eliminar.");
        } else {
            inicio = (inicio + 1) % MAXIMO;
            a = V[inicio];
        }
        return a;
    }
    public int tamanio() {
        return (fin - inicio + MAXIMO) % MAXIMO;
    }
    private void copiar(Cola B) {
        while (!B.esVacia()) {
            agregar(B.eliminar());
        }
    }
    public void leer() {
        Scanner in = new Scanner(System.in);
        System.out.print("Nro.Elementos: ");
        int n = in.nextInt();
        System.out.println("Ingrese elementos:");
        for (int i = 0; i < n; i++) {
            int a = in.nextInt();
            agregar(a);
        }
    }
    public void mostrar() {
        if (esVacia()) {
            System.out.println("Cola Vacia! No se puede mostrar nada.");
        } else {
            Cola X = new Cola();
            while (!esVacia()) {
                int a = eliminar();
                System.out.print(" " + a);
                X.agregar(a);
            }
            this.copiar(X);
            System.out.println("");
        }
    }
    public static void main(String[] args) {

    }
   
}

sábado, 22 de octubre de 2011

colas

  • DEFINICION
Una cola es un tipo especial de lista abierta en la que sólo se pueden insertar nodos en uno de los extremos de la lista y sólo se pueden eliminar nodos en el otro. Además, como sucede con las pilas, las escrituras de datos siempre son inserciones de nodos, y las lecturas siempre eliminan el nodo leído.
Este tipo de lista es conocido como lista FIFO (First In First Out), el primero en entrar es el primero en salir.
  • TIPOS
Colas circulares (anillos): en las que el último elemento y el primero están unidos.

Colas de prioridad: En ellas, los elementos se atienden en el orden indicado por una prioridad asociada a cada uno. Si varios elementos tienen la misma prioridad, se atenderán de modo convencional según la posición que ocupen.
Bicolas: son colas en donde los nodos se pueden añadir y quitar por ambos extremos. Para representar las bicolas lo podemos hacer con un array circular con Inicio y Fin que apunten a cada uno de los extremos.


  • PROGRAMA
public void inserta(Elemento x) {
Nodo Nuevo;
Nuevo=new Nodo(x, null);
if (NodoCabeza==null)
NodoCabeza=Nuevo;
else
NodoFinal.Siguiente=Nuevo;
NodoFinal=Nuevo;
}
public Elemento cabeza()throws IllegalArgumentException {
if (NodoCabeza == null) throw new IllegalArgumentException();
else return NodoCabeza.Info;
}
public Cola(){
// Devuelve una Cola vacía
NodoCabeza=null;
NodoFinal=null;
}