Estructura de DAtos --Listas.pilas

  • Upload
    1212ed

  • View
    230

  • Download
    2

Embed Size (px)

Citation preview

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    1/48

    Artculo

    InicioArtculoLenguajes orientados a objetoJavaJ2EE

    20votar!

    Estructuras de Datos y Algoritmos en Java

    Listas Enlazadaso Lista de Enlace Simpleo Los Algoritmos de Concatenacin e Inversino Lista Doblemente Enlazada

    Algoritmo de Insercin-Ordenadao Lista de Enlace Circularo Listas Enlazadas frente a Arrays

    Listas Enlazadas

    Adems de los arrays, otra de las estructuras de datos muy utilizada es la lista enlazada. Esta estructuraimplica cuatro conceptos: clase auto-refenciada, nodo, campo de enlace y enlace.

    Clase auto-referenciada: una clase con al menos un campo cuyo tipo de referencia es elnombre de la clase:

    class Employee {

    private int empno;

    private String name;

    private double salary;

    public Employee next;

    // Other members

    }

    Employee es una clase auto-referenciada porque su campo next tiene el tipo Employee.

    Nodo: un objeto creado desde una clase auto-referenciada.

    Campo de enlace: un campo cuyo tipo de referencia es el nombre de la clase. En el

    fragmento de cdigo anterior, next es un campo de enlace. Por el contrario, empno, name, ysalary son campos no de enlace.

    Enlace: la referencia a un campo de enlace. En el fragmento de cdigo anterior, la referencianext a un nodo Employee es un enlace.

    Los cuatro conceptos de arriba nos llevan a la siguiente definicin: unalista enlazadaes una secuencia denodos que se interconectan mediante sus campos de enlace. En ciencia de la computacin se utiliza unanotacin especial para ilustrar las listas enlazadas. En la siguiente imagen aparece una variante de estanotacin que utilizar a lo largo de esta seccin:

    http://www.programacion.com/http://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#pag4http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#pag4http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#41_singlehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#41_singlehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_concatenhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_concatenhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_doublehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_doublehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#421_insercionhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#421_insercionhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#43_circularhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#43_circularhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#44_vshttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#44_vshttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#44_vshttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#43_circularhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#421_insercionhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_doublehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#42_concatenhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#41_singlehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4#pag4http://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/poohttp://www.programacion.com/http://www.programacion.com/
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    2/48

    La figura anterior presenta tres nodos: A, B y C. Cada nodo se divide en reas de contenido (en naranja) y unao ms reas de enlace (en verde). Las reas de contenido representan todos los campos que no son enlaces, ycada rea de enlace representa un campo de enlace. Las reas de enlace de A y C tienen unas flechas paraindicar que referencian a otro nodo del mismo tipo (o subtipo). El nico rea de enlace de B incorpora una X

    para indicar una referencia nula. En otras palabras, B no est conectado a ningn otro nodo.

    Aunque se pueden crear muchos tipos de listas enlazadas, las tres variantes ms populares son la lista deenlace simple, la lista doblemente enlazada y la lista enlazada circular. Exploremos esas variantes, empezandocon la lista enlazada.

    Lista de Enlace Simple

    Una lista de enlace simple es una lista enlazada de nodos, donde cada nodo tiene un nico campo deenlace. Una variable de referencia contiene una referencia al primer nodo, cada nodo (excepto el ltimo)enlaza con el nodo siguiente, y el enlace del ltimo nodo contiene null para indicar el final de la lista.

    Aunque normalmente a la variable de referencia se la suele llamar top, usted puede elegir el nombre que

    quiera. La siguiente figura presenta una lista de enlace simple de tres nodos, donde top referencia al nodo A,A conecta con B y B conecta con C y C es el nodo final:

    Un algoritmo comn de las listas de enlace simple es la insercin de nodos. Este algoritmo est implicado dealguna forma porue tiene mucho que ver con cuatro casos: cuando el nodo se debe insertar antes del primernodo; cuando el nodo se debe insertar despus del ltimo nodo; cuando el nodo se debe insertar entre dosnodos; y cuando la lista de enlace simple no existe. Antes de estudiar cada caso consideremos el siguiente

    pseudocdigo:

    DECLARE CLASS Node

    DECLARE STRING name

    DECLARE Node next

    END DECLARE

    DECLARE Node top = NULL

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    3/48

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    4/48

    temp2 = top

    // We assume top (and temp2) are not NULL

    // because of the previous pseudocode

    WHILE temp2.next IS NOT NULL

    temp2 = temp2.next

    END WHILE

    // temp2 now references the last node

    temp2.next = temp

    La siguiente imagen revela la l ista despus de la insercecin del nodo C despus del nodo A.

    El nodo se debe insertar entre dos nodos:Este es el caso ms complejo. Se crea un Node, se inicializa su campo no de enlace, se

    atraviesa la lista hasta encontrar el Node que aparece antes del nuevo Node, se asigna el

    campo de enlace del Node anterior al campo de enlace del Node recien creado, y se asigna la

    referencia del Node recien creado al campo del enlace del Node anterior. El siguiente

    pseudocdigo realiza estas tareas:

    temp = NEW Node

    temp.name = "D"

    temp2 = top

    // We assume that the newly created Node is inserted after Node

    // A and that Node A exists. In the real world, there is no

    // guarantee that any Node exists, so we would need to check

    // for temp2 containing NULL in both the WHILE loop's header

    // and after the WHILE loop completes.

    WHILE temp2.name IS NOT "A"

    temp2 = temp2.next

    END WHILE

    // temp2 now references Node A.

    temp.next = temp2.next

    temp2.next = temp

    La siguiente imagen muestra la insercin del nodo D entre los nodos A y C.

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    5/48

    El siguiente listado presenta el equivalente Java de los ejemplos de pseudocdigo de inserccin anteriores:

    // SLLInsDemo.java

    class SLLInsDemo {

    static class Node {

    String name;

    Node next;

    }

    public static void main (String [] args) {

    Node top = null;

    // 1. The singly linked list does not exist

    top = new Node ();

    top.name = "A";

    top.next = null;

    dump ("Case 1", top);

    // 2. The singly linked list exists, and the node must be inserted

    // before the first node

    Node temp;

    temp = new Node ();

    temp.name = "B";temp.next = top;

    top = temp;

    dump ("Case 2", top);

    // 3. The singly linked list exists, and the node must be inserted

    // after the last node

    temp = new Node ();

    temp.name = "C";

    temp.next = null;

    Node temp2;

    temp2 = top;

    while (temp2.next != null)

    temp2 = temp2.next;

    temp2.next = temp;

    dump ("Case 3", top);

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    6/48

    // 4. The singly linked list exists, and the node must be inserted

    // between two nodes

    temp = new Node ();

    temp.name = "D";

    temp2 = top;

    while (temp2.name.equals ("A") == false)

    temp2 = temp2.next;

    temp.next = temp2.next;

    temp2.next = temp;

    dump ("Case 4", top);

    }

    static void dump (String msg, Node topNode) {

    System.out.print (msg + " ");

    while (topNode != null) {

    System.out.print (topNode.name + " ");

    topNode = topNode.next;

    }

    System.out.println ();

    }

    }

    El mtodo static void dump(String msg, Node topNode) itera sobre la lista e imprime su

    contenido. Cuando se ejecuta SLLInsDemo, las repetidas llamadas a este mtodo dan como resultado lasiguiente salida, lo que coincide con las imagnes anteriores:

    Case 1 ACase 2 B A

    Case 3 B A C

    Case 4 B A D C

    Nota:

    SLLInsDemo y los ejemplos de pseudocdigo anteriores empleaban un algoritmo de bsqueda lineal

    orientado a listas enlazadas para encontrar un Node especfico. Indudablemente usted utilizar este otroalgoritmo en sus propios programas:

    Bsqueda del ltimoNode:

    // Assume top references a singly linked list of at least oneNode.

    Node temp = top // We use temp and not top. If top were used, we

    // couldn't access the singly linked list after

    // the search finished because top would refer

    // to the final Node.

    WHILE temp.next IS NOT NULL

    temp = temp.next

    END WHILE

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    7/48

    // temp now references the last Node.

    Bsqueda de un Node especfico:

    // Assume top references a singly linked list of at least oneNode.

    Node temp = top

    WHILE temp IS NOT NULL AND temp.name IS NOT "A" // Search for "A".

    temp = temp.next

    END WHILE

    // temp either references Node A or contains NULL if Node A notfound.

    Otro algoritmo comn de las listas de enlace simples es el borrado de nodos. Al contrario que la inserccin denodos, slo hay dos casos a considerar:

    Borrar el Primer nodo:Asigna el enlace del campo next del nodo referenciado por top a top:

    top = top.next; // Reference the second Node (or NULL if there isonly one Node)

    La siguiente imagen presenta las vistas anterior y posterior de una lista donde se ha borrado elprimer nodo. en esta figura, el nodo B desaparece y el nodo A se convierte en el primer nodo.

    Borrar cualquier nodo que no sea el primero:Localiza el nodo que precede al nodo a borrar y le asigna el enlace que hay en el campo next

    del nodo a borrar al campo next del nodo que le precede. El siguiente pseudocdigo borra el

    nodo D:

    temp = top

    WHILE temp.name IS NOT "A"

    temp = temp.next

    END WHILE

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    8/48

    // We assume that temp references Node A

    temp.next = temp.next.next

    // Node D no longer exists

    La siguiente figura presenta las vistas anterior y posterior de una lista donde se ha borrado unnodo intermedio. En esa figura el nodo D desaparece.

    El siguiente listado representa el equivalente Java a los pseudocdigos de borrado anteriores:

    // SLLDelDemo.java

    class SLLDelDemo {

    static class Node {

    String name;

    Node next;

    }

    public static void main (String [] args) {// Build Figure 6's singly linked list (i.e., B A D C)

    Node top = new Node ();

    top.name = "C";

    top.next = null;

    Node temp = new Node ();

    temp.name = "D";

    temp.next = top;

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    9/48

    top = temp;

    temp = new Node ();

    temp.name = "A";

    temp.next = top;

    top = temp;

    temp = new Node ();temp.name = "B";

    temp.next = top;

    top = temp;

    dump ("Initial singly-linked list", top);

    // 1. Delete the first node

    top = top.next;

    dump ("After first node deletion", top);

    // Put back B

    temp = new Node ();

    temp.name = "B";

    temp.next = top;

    top = temp;

    // 2. Delete any node but the first node

    temp = top;

    while (temp.name.equals ("A") == false)

    temp = temp.next;

    temp.next = temp.next.next;

    dump ("After D node deletion", top);

    }

    static void dump (String msg, Node topNode) {

    System.out.print (msg + " ");

    while (topNode != null) {

    System.out.print (topNode.name + " ");

    topNode = topNode.next;

    }

    System.out.println ();

    }}

    Cuando ejecute SLLDelDemo, observar la siguiente salida:

    Initial singly linked list B A D C

    After first node deletion A D C

    After D node deletion B A C

    Cuidado:

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    10/48

    Como java inicializa los campos de referencias de un objeto a null durante la construccin del objeto, no es

    necesario asignar explcitamente null a un campo de enlace. No olvide estas asignaciones de null en su

    cdigo fuente; su ausencia reduce la claridad del cdigo.

    Despus de estudiar SLLDelDemo, podra preguntarse qu sucede si asigna null al nodo referenciado por

    top: el recolector de basura recoger toda la lista? Para responder a esta cuestin, compile y ejecute el

    cdigo del siguiente listado:

    // GCDemo.java

    class GCDemo {

    static class Node {

    String name;

    Node next;

    protected void finalize () throws Throwable {

    System.out.println ("Finalizing " + name);

    super.finalize ();

    }

    }

    public static void main (String [] args) {

    // Build Figure 6's singly linked list (i.e., B A D C)

    Node top = new Node ();

    top.name = "C";

    top.next = null;

    Node temp = new Node ();

    temp.name = "D";

    temp.next = top;

    top = temp;

    temp = new Node ();

    temp.name = "A";

    temp.next = top;

    top = temp;

    temp = new Node ();

    temp.name = "B";

    temp.next = top;

    top = temp;

    dump ("Initial singly-linked list", top);

    top = null;

    temp = null;

    for (int i = 0; i < 100; i++)

    System.gc ();

    }

    static void dump (String msg, Node topNode) {

    System.out.print (msg + " ");

    while (topNode != null){

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    11/48

    System.out.print (topNode.name + " ");

    topNode = topNode.next;

    }

    System.out.println ();

    }

    }

    GCDemo crea la misma lista de cuatro nodos que SLLDelDemo. Despus de volcar los nodos a la salida

    estndar, GCDemo asigna null a top y a temp. Luego, GCDemo ejecuta System.gc (); hasta 100

    veces. Qu sucede despus? Mire la salida (que he observado en mi plataforma Windows):

    Initial singly-linked list B A D C

    Finalizing C

    Finalizing D

    Finalizing A

    Finalizing B

    La salida revela que todos los nodos de la lista de enlace simple han sido finalizados (y recolectados). Comoresultado, no tiene que preocuparse de poner a null todos los enlaces de una lista de enlace simple cuando

    se quiera deshacer de ella. (Podra necesitar tener que incrementar el nmero de ejecuciones de System.gc(); si su salida no incluye los mensajes de finalizacin.)

    Los Algoritmos de Concatenacin e Inversin

    Existen muchos algoritmos tiles para listas de enlace simple. Uno de ellos es la concatenacin, que implicaque puede aadir una lista de enlace simple al final de otra lista.

    Otro algoritmo til es la inversin. Este algoritmo invierte los enlaces de una lista de enlace simple permitiendoatravesar los nodos en direccion opuesta. El siguiente cdigo extiende la clase anterior para invertir los enlacesde la lista referenciada por top1:

    >

    // CIDemojava

    class CIDemo {

    static class DictEntry {

    String word;

    String meaning;

    DictEntry next;

    }

    // ListInfo is necessary because buildList() must return two pieces

    // of information

    static class ListInfo {

    DictEntry top;

    DictEntry last;

    }

    public static void main (String [] args) {

    String [] wordsMaster = { "aardvark", "anxious", "asterism" };

    ListInfo liMaster = new ListInfo ();

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    12/48

    buildList (liMaster, wordsMaster);

    dump ("Master list =", liMaster.top);

    String [] wordsWorking = { "carbuncle", "catfish", "color" };

    ListInfo liWorking = new ListInfo ();

    buildList (liWorking, wordsWorking);

    dump ("Working list =", liWorking.top);

    // Perform the concatenation

    liMaster.last.next = liWorking.top;

    dump ("New master list =", liMaster.top);

    invert (liMaster);

    dump ("Inverted new master list =", liMaster.top);

    }

    static void buildList (ListInfo li, String [] words) {

    if (words.length == 0)return;

    // Create a node for first word/meaning

    li.top = new DictEntry ();

    li.top.word = words [0];

    li.top.meaning = null;

    // Initialize last reference variable to

    // simplify append and make concatenation possible.

    li.last = li.top;

    for (int i = 1; i < words.length; i++) {

    // Create (and append) a new node for next word/meaning

    li.last.next = new DictEntry ();

    li.last.next.word = words [i];

    li.last.next.meaning = null;

    // Advance last reference variable to simplify

    // append and make concatenation possible

    li.last = li.last.next;

    }

    li.last.next = null;

    }

    static void dump (String msg, DictEntry topEntry) {

    System.out.print (msg + " ");

    while (topEntry != null) {

    System.out.print (topEntry.word + " ");

    topEntry = topEntry.next;

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    13/48

    }

    System.out.println ();

    }

    static void invert (ListInfo li) {

    DictEntry p = li.top, q = null, r;

    while (p != null) {r = q;

    q = p;

    p = p.next;

    q.next = r;

    }

    li.top = q;

    }

    }

    CIDemo declara un DictEntry anidado en la clase de ms alto nivel cuyos objetos contienen palabras y

    significados. (Para mentener el programa lo ms sencillo posible, he evitado los significados. Usted puedeaadirlos si lo desea). CIDemo tambin declara ListInfo para seguir las referencias el primero y ltimo

    DictEntry de una lista de enlace simple.

    El thread principal ejecuta el mtodo public static void main(String [] args) de CIDemo.

    Este thread llama dos veces al mtodo static void buildList (ListInfo li, String []

    words) para crear dos listas de enlace simple: una lista maestra (cuyos nodos se rellenan con palabras del

    array wordsMaster), y una lista de trabajo (cuyos nodos se rellenan con palabras del array

    wordsWorking). Antes de cada llamada al mtodo buildList (ListInfo li, String []

    words), el thread principal crea y pasa un objeto ListInfo. este objeto devuelve las referencias alprimero y ltimo nodo. (Una llamada a mtodo devuelve directamente un slo dato). Despus de construir unalista de enlace simple, el thread principal llama a static void dump (String msg, DictEntry

    topEntry) para volcar un mensaje y las palabras de los nodos de una lista en el dispositivo de salida

    estndar.

    Se podra estar preguntando sobre la necesidad del campo last de ListInfo. Este campo sirve a un doble

    propsito: primero, simplifica la creacin de cada lista, donde se aaden los nodos. Segundo, este camposimplifica la concatenacin, que se queda slo en la ejecucin de la siguiente lnea de cdigo:liMaster.last.next = liWorking.top;. Una vez que se completa la concatenacin, y el thread

    principal vuelva los resultados de la lista maestra en la salida estndar, el thread llama al mtodo static

    void invert (ListInfo li) para invertir la lista maestra y luego muestra la lista maestra invertida

    por la salida estndar.

    Cuando ejecute CIDemo ver la siguiente salida:

    Master list = aardvark anxious asterism

    Working list = carbuncle catfish color

    New master list = aardvark anxious asterism carbuncle catfish colorInverted new master list = color catfish carbuncle asterism anxious

    aardvark

    Lista Doblemente Enlazada

    Las listas de enlace simple restringen el movimiento por lo nodos a una sla direccin: no puede atravesar unalista de enlace simple en direccin opuesta a menos que primero utilice el algoritmo de inversin para invertir

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    14/48

    los enlaces de los nodos, lo que lleva tiempo. Despus de atraversarlos en direccin opuesta, problamentenecesitar repetir la inversin para restaurar el orden original, lo que lleva an ms tiempo. Un segundoproblema implica el borrado de nodos: no puede borrar un nodo arbitrario sin acceder al predecesor del nodo.Estos problemas desaperecen cuando se utiliza una lista doblemente enlazada.

    Una lista doblemente enlazadaes una lista enlazada de nodos, donde cada nodo tiene un par de campos deenlace. Un campo de enlace permite atravesar la lista hacia adelante, mientras que el otro permite atravesar la

    lista haca atrs. Para la direccin hacia adelante, una variable de referencia contiene una referencia al primernodo. Cada nodo se enlaza con el siguiente mediante el campo de enlace next, excepto el ltimo nodo, cuyo

    campo de enlace next contiene null para indicar el final de la lista (en direccion hacia adelante). De formasimilar, para la direccin contraria, una variable de referencia contiene una referencia al ltimo nodo de ladireccin normal (hacia adelante), lo que se interpreta como el primer nodo. Cada nodo se enlaza con elanterior mediante el campo de enlace previous, y el primer nodo de la direccion hacia adelante, contiene

    null en su campo previous para indicar el fin de la lista. La siguiente figura representa una lista

    doblemente enlazada de tres nodos, donde topForward referencia el primer nodo en la direccion hacia

    adelante, y topBackward referencia el primero nodo la direccin inversa.

    Truco:

    Piense en una lista doblemente enlazada como una pareja de listas de enlace simple que interconectan losmismos nodos.

    La insercin y borrado de nodos en una lista doblemente enlazada son operaciones comunes. Estasoperaciones se realizan mediante algoritmos que se basan en los algoritmos de insercin y borrado de laslistas de enlace simple (porque las listas doblemente enlazadas slo son una pareja de listas de enlace simpleque interconectan los mismos nodos).

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    15/48

    El siguiente listado muestra la insercin de nodos para crear la lista de la figura anterior, el borrado de nodosya que elimina el nodo B de la lista, y el movimiento por la lista en ambas direcciones:

    // DLLDemo.java

    class DLLDemo {

    static class Node {

    String name;

    Node next;

    Node prev;

    }

    public static void main (String [] args) {

    // Build a doubly linked list

    Node topForward = new Node ();

    topForward.name = "A";

    Node temp = new Node ();

    temp.name = "B";

    Node topBackward = new Node ();

    topBackward.name = "C";

    topForward.next = temp;

    temp.next = topBackward;

    topBackward.next = null;

    topBackward.prev = temp;

    temp.prev = topForward;

    topForward.prev = null;

    // Dump forward singly linked list

    System.out.print ("Forward singly-linked list: ");

    temp = topForward;

    while (temp != null){

    System.out.print (temp.name);

    temp = temp.next;

    }

    System.out.println ();

    // Dump backward singly linked list

    System.out.print ("Backward singly-linked list: ");

    temp = topBackward;

    while (temp != null){

    System.out.print (temp.name);

    temp = temp.prev;

    }

    System.out.println ();

    // Reference node B

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    16/48

    temp = topForward.next;

    // Delete node B

    temp.prev.next = temp.next;

    temp.next.prev = temp.prev;

    // Dump forward singly linked list

    System.out.print ("Forward singly-linked list (after deletion): ");

    temp = topForward;

    while (temp != null){

    System.out.print (temp.name);

    temp = temp.next;

    }

    System.out.println ();

    // Dump backward singly linked list

    System.out.print ("Backward singly-linked list (after deletion):

    ");

    temp = topBackward;

    while (temp != null){

    System.out.print (temp.name);

    temp = temp.prev;

    }

    System.out.println ();

    }

    }

    Cuando se ejecuta, DLLDemo produce la siguiente salida:

    Forward singly-linked list: ABC

    Backward singly-linked list: CBA

    Forward singly-linked list (after deletion): AC

    Backward singly-linked list (after deletion): CA

    Algoritmo de Insercin-Ordenada

    Algunas veces querr crear una lista doblemente enlazada que organice el orden de sus nodos basndose en

    un campo no de enlace. Atravesar la lista doblemente enlazada en una direccin presenta esos nodos enorden ascendente, y atravsarla en en direccin contraria los presenta ordenados descedentemente. Elalgoritmo de ordenacin de burbuja es inapropiado en este caso porque requiere ndices de array. Por elcontrario, insercin-ordenadaconstruye una lista de enlace simple o una lista doblemente enlzada ordenadaspor un campo no de enlace para identificar el punto de insercin de cada nuevo nodo. El siguiente litadodemuestra el algoritmo de insercin-ordenada:

    // InsSortDemo.java

    class InsSortDemo {

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    17/48

    // Note: To keep Employee simple, I've omitted various constructor and

    // nonconstructor methods. In practice, such methods would be present.

    static class Employee {

    int empno;

    String name;

    Employee next;Employee prev;

    }

    public static void main (String [] args) {

    // Data for a doubly linked list of Employee objects. The lengths

    of

    // the empnos and names arrays must agree.

    int [] empnos = { 687, 325, 567, 100, 987, 654, 234 };

    String [] names = { "April", "Joan", "Jack", "George", "Brian",

    "Sam", "Alice" };

    Employee topForward = null;Employee topBackward = null;

    // Prime the doubly linked list by creating the first node.

    topForward = new Employee ();

    topForward.empno = empnos [0];

    topForward.name = names [0];

    topForward.next = null;

    topForward.prev = null;

    topBackward = topForward;

    // Insert remaining Employee nodes (in ascending order -- via

    empno)

    // into the doubly linked list.

    for (int i = 1; i < empnos.length; i++) {

    // Create and initialize a new Employee node.

    Employee e = new Employee ();

    e.empno = empnos [i];

    e.name = names [i];

    e.next = null;

    e.prev = null;

    // Locate the first Employee node whose empno is greater than

    // the empno of the Employee node to be inserted.

    Employee temp = topForward;

    while (temp != null && temp.empno

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    18/48

    topBackward.next = e; // Append new Employee node to

    // forward singly linked list.

    e.prev = topBackward; // Update backward singly linked

    topBackward = e; // list as well.

    }else{

    if (temp.prev == null) {

    e.next = topForward; // Insert new Employee node at

    topForward = e; // head of forward singly linked

    // list.

    temp.prev = e; // Update backward singly linked

    // list as well.

    }

    else {

    e.next = temp.prev.next; // Insert new Employee node

    temp.prev.next = e; // after last Employee node

    // whose empno is smaller in

    // forward singly linked list.e.prev = temp.prev; // Update backward

    temp.prev = e; //singly linked list as well.

    }

    }

    }

    // Dump forward singly linked list (ascending order).

    System.out.println ("Ascending order:\n");

    Employee temp = topForward;

    while (temp != null) {

    System.out.println ("[" + temp.empno + ", " + temp.name + "] ");

    temp = temp.next;}

    System.out.println ();

    // Dump backward singly linked list (descending order).

    System.out.println ("Descending order:\n");

    temp = topBackward;

    while (temp != null) {

    System.out.println ("[" + temp.empno + ", " + temp.name + "] ");

    temp = temp.prev;

    }

    System.out.println ();

    }

    }

    InsSortDemo simplifica su operacin creando primero un nodo Employee primario. Para el resto de

    nodos Employee, InsSortDemo localiza la posicin de insercin apropiada basndose en el campo no de

    enlace empno, y luego inserta el Employee en esa posicin. Cuando ejecute InsSortDemo, podr

    observar la siguiente salida:

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    19/48

    Ascending order:

    [100, George]

    [234, Alice]

    [325, Joan]

    [567, Jack]

    [654, Sam]

    [687, April][987, Brian]

    Descending order:

    [987, Brian]

    [687, April]

    [654, Sam]

    [567, Jack]

    [325, Joan]

    [234, Alice]

    [100, George]

    Tanto la insercin-ordenada como la ordenacin de burbuja exhiben prcticamente el mismo rendimiento.

    Lista de Enlace Circular

    El campo de enlace del ltimo nodo de una lista de enlace simple contiene un enlace nulo, ocurre lo mismo enlos campos de enlace del primer y ltimo elemento en ambas direcciones en las listas doblemente enlazadas.Supongamos que en vez de esto los ltimos nodos contiene un enlace a los primeros nodos. En esta situacion,usted terminar con una lista de enlace circular, como se ve en la siguiente figura:

    Las listas de enlace circular se utilizan con frecuencia en procesamiento repetitivo de nodos en un ordenespecfico. Dichos nodos podran representar conexiones de servidor, procesadores esperando una seccincrtica, etc. Esta estructura de datos tambin sirve como base para una variante de una estructura de datosms compleja: la cola(que veremos ms adeltante).

    Listas Enlazadas frente a Arrays

    Las listas enlazadas tienen las siguiente ventajas sobre los arrays:

    No requieren memoria extra para soportar la expansin. Por el contrario, los arrays requierenmemoria extra si se necesita expandirlo (una vez que todos los elementos tienen datos no sepueden aadir datos nuevos a un array).

    Ofrecen una insercin/borrado de elementos ms rpida que sus operaciones equivalentes enlos arrays. Slo se tienen que actualizar los enlaces despus de identificar la posicin de

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    20/48

    insercin/borrado. Desde la perspectiva de los arrays, la insercin de datos requiere elmovimiento de todos los otros datos del array para crear un elemento vaco. De forma similar,el borrado de un dato existente requiere el movimiento de todos los otros datos para eliminar elelementovaco.

    En contraste, los arrays ofrecen las siguiente ventajas sobre las listas enlazadas:

    Los elementos de los arrays ocupan menos memoria que los nodos porque no requierencampos de enlace.

    Los arrays ofrecen un aceso ms rpido a los datos, medante ndices basados en enteros.

    Las listas enlazadas son ms apropiadas cuando se trabaja con datos dinmicos. En otras palabras, insercionesy borrados con frecuencia. Por el contrario, los arrays son ms apropiados cuando los datos son estticos (lasinserciones y borrados son raras). De todas formas, no olvide que si se queda sin espacio cuando aade temsa un array, debe crear un array ms grande, copiar los datos del array original el nuevo array mayor y elimiarel original. Esto cuesta tiempo, lo que afecta especialmente al rendimiento si se hace repetidamente.

    Mezclando una lista de enlace simple con un array uni-dimensional para acceder a los nodos mediante losndices del array no se consigue nada. Gastar ms memoria, porque necesitar los elementos del array mslos nodos, y tiempo, porque necesitar mover los tems del array siempre que inserte o borre un nodo. Sin

    embargo, si es posible integrar el array con una lista enlazada para crear una estructura de datos til (porejemplo, las tablas hash).

    Publicado por:Alberto de la Torre

    Recomendara un amigo

    Compartiren redes

    Comentarios

    http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/3http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/3http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/3http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/3http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/3
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    21/48

    Pilas y colas

    Inicio

    Noticias

    Articulos

    Cdigo

    Foros

    Enlaces

    Hosting

    Anuncios

    Categoras destacadas

    Artculo

    InicioArtculoLenguajes orientados a objetoJavaJ2EE

    http://www.programacion.com/http://www.programacion.com/http://www.programacion.com/noticiashttp://www.programacion.com/noticiashttp://www.programacion.com/articuloshttp://www.programacion.com/articuloshttp://www.programacion.com/codigoshttp://www.programacion.com/codigoshttp://www.programacion.com/foroshttp://www.programacion.com/foroshttp://www.programacion.com/direccioneshttp://www.programacion.com/direccioneshttp://www.hostalia.com/http://www.hostalia.com/http://www.programacion.com/tablonhttp://www.programacion.com/tablonhttp://www.programacion.com/http://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/poohttp://www.programacion.com/http://www.programacion.com/http://www.programacion.com/tablonhttp://www.programacion.com/tablonhttp://www.hostalia.com/http://www.hostalia.com/http://www.programacion.com/direccioneshttp://www.programacion.com/direccioneshttp://www.programacion.com/foroshttp://www.programacion.com/foroshttp://www.programacion.com/codigoshttp://www.programacion.com/codigoshttp://www.programacion.com/articuloshttp://www.programacion.com/articuloshttp://www.programacion.com/noticiashttp://www.programacion.com/noticiashttp://www.programacion.com/http://www.programacion.com/
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    22/48

    20votar!

    Estructuras de Datos y Algoritmos en Java

    Pilas y Colaso Pilas que "Recuerdan"

    o Priorizar con Colas

    Pilas y Colas

    Los desarrolladores utilizan los arrays y las variantes de listas enlazadas para construir una gran variedad deestructuras de datos complejas. Este pgina explora dos de esas estructuras: las Pilas, las Colas . Cuandopresentemos los algoritmos lo haremos ncamente en cdigo Java por motivos de brevedad.

    Pilas que "Recuerdan"

    La Pilaes una estrucutra de datos donde las inserciones y recuperaciones/borrados de datos se hacen en unode los finales, que es conocido como el topde la pila. Como el ltimo elemento insertado es el primero enrecuperarse/borrarse, los desarrolladores se refieren a estas pilas como pilas LIFO (last-in, first-out).

    Los datos se push(insertan) dentro y se pop(recuperan/borran) de la parte superior de la pila. La siguientefigura ilustra una pila con tres String cada uno insertado en la parte superior de la pila:

    Como muestra la figura anterior, las pilas se construyen en memoria. Por cada dato insertado, el itm superioranterior y todos los datos inferiores se mueven hacia abajo. Cuando llega el momento de sacar un tem de lapila, se recpupera y se borra de la pila el tem superior (que en la figura anterior se revela como "third").

    Las pilas son muy tiles en varios escenarios de programacin. Dos de los ms comunes son:

    Pilas que contienen direcciones de retorno:Cuando el cdigo llama a un mtodo, la direccin de la primera instruccin que sigue a lallamada se inserta en la parte superior de la pila de llamadas de mtodos del thread actual.Cuando el mtodo llamado ejecuta la instruccin return, se saca la direccin de la parte

    superior de la pila y la ejecucin contina en sa direccin. Si un mtodo llama a otro mtodo, elcomportamiento LIFO de la pila asegura que la instruccin return del segundo mtodo

    http://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    23/48

    transfiere la ejecucin al primer mtodo, y la del primer mtodo transfiere la ejecucin al cdigoque sigue al cdigo que llam al primer mtodo. Como resultado una pila "recuerda" lasdirecciones de retorno de los mtodos llamados.

    Pilas que contienen todos los parmetros del mtodo llamado y las variables locales:Cuando se llama a un mtodo, la JVM reserva memoria cerca de la direccin de retorno yalmacena todos los parmetros del mtodo llamado y las variables locales de ese mtodo. Si elmtodo es un mtodo de ejemplar, uno de los parmetros que almacena en la pila es la

    referencia this del objeto actual.

    Es muy comn implementar una pila utilizando un array uni-dimensional o una lista de enlace simple. En elescenario del array uni-dimensional, una variable entera, tpicamente llamada top, contiene el ndice de la

    parte superior de la pila. De forma similar, una variable de referencia, tambin nombrada noramlmente comotop, referencia el nodo superior del escenario de la lista de enlace simple.

    He modelado mis implementaciones de pilas despus de encontrar la arquitectura del API Collections de Java.Mis implementaciones constan de un interface Stack para una mxima flexibilidad, las clases de

    implementacin ArrayStack y LinkedListStack, y una clase de soporte FullStackException.

    Para facilitar su distribucin, he empaquetado estas clases en un paquete llamado com.javajeff.cds,

    donde cds viene de estructura de datos complejas. El siguiente listado presenta el interface Stack:

    // Stack.java

    package com.javajeff.cds;

    public interface Stack {

    boolean isEmpty ();

    Object peek ();

    void push (Object o);

    Object pop ();

    }

    Sus cuatro mtodos determinan si la pila est vaca, recuperan el elemento superior sin borrarlo de la pia,situan un elemento en la parte superior de la pila y el ltimo recuera/borra el elemento superior. Aparte de un

    constructor especfico de la implementacin, su programa nicamente necesita l lamar a estos mtodos.

    El siguiente listado presenta una implementacin de un Stack basado en un array uni-dimensional:

    // ArrayStack.java

    package com.javajeff.cds;

    public class ArrayStack implements Stack {

    private int top = -1;

    private Object [] stack;

    public ArrayStack (int maxElements) {

    stack = new Object [maxElements];}

    public boolean isEmpty () {

    return top == -1;

    }

    public Object peek () {

    if (top < 0)

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    24/48

    throw new java.util.EmptyStackException ();

    return stack [top];

    }

    public void push (Object o) {

    if (top == stack.length - 1)

    throw new FullStackException ();

    stack [++top] = o;}

    public Object pop () {

    if (top < 0)

    throw new java.util.EmptyStackException ();

    return stack [top--];

    }

    }

    ArrayStack revela una pila como una combinacin de un ndice entero privado top y variables de

    referencia de un array uni-dimensional stack. top identifica el elemento superior de la pila y lo inicializa a -

    1 para indica que la pila est vaca. Cuando se crea un objeto ArrayStack llama a public

    ArrayStack(int maxElements) con un valor entero que representa el nmero mximo de elementos.Cualquier intento de sacar un elemento de una pila vaca mediante pop() resulta en el lanzamiento de una

    java.util.EmptyStackException. De forma similar, cualquier intento de poner ms elementos de

    maxElements dentro de la pila utilizando push(Object o) lanzar una FullStackException,cuyo cdigo aparece en el siguiente listado:

    // FullStackException.java

    package com.javajeff.cds;

    public class FullStackException extends RuntimeException {

    }

    Por simetra con EmptyStackException, FullStackException extiende RuntimeException.

    Como resultado no se necesita aadir FullStackException a la clausula throws del mtodo.

    El siguiente listado presenta una implementacin de Stack utilizando una lista de enlace simple:

    // LinkedListStack.java

    package com.javajeff.cds;

    public class LinkedListStack implements Stack {

    private static class Node {

    Object o;

    Node next;

    }

    private Node top = null;

    public boolean isEmpty () {

    return top == null;

    }

    public Object peek () {

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    25/48

    if (top == null)

    throw new java.util.EmptyStackException ();

    return top.o;

    }

    public void push (Object o) {

    Node temp = new Node ();

    temp.o = o;temp.next = top;

    top = temp;

    }

    public Object pop () {

    if (top == null)

    throw new java.util.EmptyStackException ();

    Object o = top.o;

    top = top.next;

    return o;

    }

    }

    LinkedListStack revela una pila como una combinacin de una clase anidada privada de alto nivel

    llamada Node y una variable de referencia privada top que se inicialia a null para indicar una pila vaca. Al

    contrario que su contrapartida del array uni-dimensional, LinkedListStack no necesita un constructor ya

    que se expande dinmicamente cuando se ponen los tems en la pila. As, void push(Object o) no

    necesita lanzar una FullStackException. Sin embargo, Object pop() si debe chequear si la pila

    est vaca, lo que podra resultar en el lanzamiento de una EmptyStackException.

    Ahora que ya hemos visto el interface y las tres clases que generan mis implementaciones de las pilas, juguemos un poco. El siguiente listado muestra casi todo el soporte de pilas de mi paquetecom.javajeff.cds:

    // StackDemo.java

    import com.javajeff.cds.*;

    class StackDemo {

    public static void main (String [] args) {

    System.out.println ("ArrayStack Demo");

    System.out.println ("---------------");

    stackDemo (new ArrayStack (5));

    System.out.println ("LinkedListStack Demo");

    System.out.println ("--------------------");

    stackDemo (new LinkedListStack ());

    }

    static void stackDemo (Stack s) {System.out.println ("Pushing \"Hello\"");

    s.push ("Hello");

    System.out.println ("Pushing \"World\"");

    s.push ("World");

    System.out.println ("Pushing StackDemo object");

    s.push (new StackDemo ());

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    26/48

    System.out.println ("Pushing Character object");

    s.push (new Character ('C'));

    System.out.println ("Pushing Thread object");

    s.push (new Thread ("A"));

    try {

    System.out.println ("Pushing \"One last item\"");s.push ("One last item");

    }

    catch (FullStackException e) {

    System.out.println ("One push too many");

    }

    System.out.println ();

    while (!s.isEmpty ())

    System.out.println (s.pop ());

    try {

    s.pop ();

    }catch (java.util.EmptyStackException e) {

    System.out.println ("One pop too many");

    }

    System.out.println ();

    }

    }

    Cuando se ejecuta StackDemo, produce la siguiente salida:

    ArrayStack Demo

    ---------------

    Pushing "Hello"

    Pushing "World"Pushing StackDemo object

    Pushing Character object

    Pushing Thread object

    Pushing "One last item"

    One push too many

    Thread[A,5,main]

    C

    StackDemo@7182c1

    World

    Hello

    One pop too many

    LinkedListStack Demo

    --------------------

    Pushing "Hello"

    Pushing "World"

    Pushing StackDemo object

    Pushing Character object

    Pushing Thread object

    Pushing "One last item"

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    27/48

    One last item

    Thread[A,5,main]

    C

    StackDemo@cac268

    World

    Hello

    One pop too many

    Priorizar con Colas

    La Cola es una estructura de datos donde la insercin de tem se hace en un final (el fin de la cola) y larecuperacin/borrado de elementos se hace en el otro final (el inicio de la cola). Como el primer elementoinsertado es el primero en ser recuperado, los desarrolladores se refieren a estas colas como estructuras FIFO(first-in, first-out).

    Normalmente los desarrolladores tabajan con dos tipos de colas: lineal y circular. En ambas colas, la insercinde datos se realiza en el fin de la cola, se mueven hacia adelante y se recuperan/borran del incio de la cola. Lasiguiente figura ilustra las colas lineal y circular:

    La cola lineal de la figura anterior almacena cuatro enteros, con el entero 1 en primer lugar. Esa cola est llenay no puede almacenar ms datos adicionales porque rear identifica la parte final de la cola. La razn de la

    posicin vaca, que identifica front, implica el comportamiento lineal de la cola. Inicialmente, front y

    rear identifican la posicin ms a la izquierda, lo que indica que la cola est vaca. Para almacenar el entero

    1, rear avanza una posicin hacia la derecha y almacena 1 en esa posicin. Para recuperar/borrar el entero

    1, front avanza una posicin hacia la derecha.

    Nota:

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    28/48

    Para sealar que la cola lineal est vaca, no necesita gastar una posicin, aunque esta aproximacin algunasveces es muy conneniente. En su lugar asigne el mismo valor que indique una posicin no existente a front

    y a rear. Por ejemplo, asumiendo una implementacin basada en un array uni-dimensional, front y rear

    podran contener -1. El ndice 0 indica entonces la posicin ms a la izquierda, y los datos se insertarnempezando en este ndice.

    Cuando rear identifique la posicin ms a la derecha, la cola lineal podra no estar llena porque front

    podra haber avanzado almenos una posicin para recuperar/borrar un dato. En este esceario, consideremover todos los tems de datos hacia la izquierda y ajuste la posicin de front y rear de la forma

    apropiada para crear ms espacio. Sin embargo, demasiado movimiento de datos puede afectar alrendimiento, por eso debe pensar cuidadosamente en los costes de rendimiento si necesita crear msespacio.

    La cola circular de la figura anterior tiene siete datos enteros, con el entero 1 primero. Esta cola est llena yno puede almacenar ms datos hasta que front avance una posicin en sentido horario (para recuperar el

    entero 1) y rear avance una posicin en la misma direcin (para identificar la posicin que contendr el

    nuevo entero). Al igual que con la cola lineal, la razon de la posicin vaca, que identifica front, implica el

    comportamiento circular de la cola. Inicialmente, front y rear identifican la misma posicin, lo que indica

    una cola vaca. Entonces rear avanza una posicin por cada nueva insercin. De forma similar, frontavanza una posicin por cada recuperacin/borrado.

    Las colas son muy tiles en varios escenarios de programacin, entre los que se encuentran:

    Temporizacin de Threads:Una JVM o un sistema operativo subyacente podran establecer varias colas para coincidir condiferentes prioridades de los threads. La informacin del thread se bloquea porque todos losthreads con una prioridad dada se almacenan en una cola asociada.

    Trabajos de impresin:Como una impresora normalmente es ms lenta que un ordenador, un sistema operativomaneja los trabajos de impresin en un subsistema de impresin, que inserta esos trabajos deimpresin en una cola. El primer trabajo en esa cola se imprime primero, y as sucesivamente.

    Los desarrolladores normalmente utilizan una array uni-dimensional para implementar una cola. Sin embargo,si tienen que co-existir mltiple colas o las inserciones en las colas deben ocurrir en posiciones distintas a laltima por motivos de prioridades, los desarrolladores suelen cambiar a la lista doblemente enlazada. Con unarray uni-dimensional dos variables enteras (normalmente llamadas front y rear) contienen los ndices del

    primer y ltimo elemento de la cola, respectivamente. Mis implementaciones de colas lineales y circulares usanun array uni-dimensional y empiezan con el interface Queue que puede ver en el siguiente listado:

    // Queue.java

    package com.javajeff.cds;

    public interface Queue {

    void insert (Object o);

    boolean isEmpty ();

    boolean isFull ();Object remove ();

    }

    Queue declara cuatro mtodos para almacenar un datos, determinar si la cola est vaca, determinar si la cola

    est llena y recuperar/borrar un dato de la cola. Llame a estos mtodos (y a un constructor) para trabajar concualquier implementacin de Queue.

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    29/48

    El siguiente listado presenta una a implementacin de Queue de una cola lineal basada en un array uni-

    dimensional:

    // ArrayLinearQueue.java

    package com.javajeff.cds;

    public class ArrayLinearQueue implements Queue {

    private int front = -1, rear = -1;

    private Object [] queue;

    public ArrayLinearQueue (int maxElements) {

    queue = new Object [maxElements];

    }

    public void insert (Object o) {

    if (rear == queue.length - 1)

    throw new FullQueueException ();

    queue [++rear] = o;

    }

    public boolean isEmpty () {

    return front == rear;

    }

    public boolean isFull () {

    return rear == queue.length - 1;

    }

    public Object remove () {

    if (front == rear)

    throw new EmptyQueueException ();

    return queue [++front];

    }

    }

    ArrayLinearQueue revela que una cola es una combinacin de variables privadas front, rear, y

    queue. front y rear se inicializan a -1 para indicar una cola vaca. Igual que el constructor de

    ArrayStack llama a public ArrayLinearQueue(int maxElements) con un valor entero que

    especifique el nmero mximo de elementos durante la construccin de un objeto ArrayLinearQueue.

    El mtodo insert(Object o) de ArrayLinearQueue lanza una FullQueueException cuando

    rear identifica el elemento final del array uni-dimensional. El cdigo de FullQueueException apareceen el siguiente listado:

    // FullQueueException.java

    package com.javajeff.cds;

    public class FullQueueException extends RuntimeException {

    }

    El mtodo remove() de ArrayLinearQueue lanza una EmptyQueueException cuando los objetos

    front y rear son iguales. El siguiente listado presenta el cdigo de esta clase:

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    30/48

    // EmptyQueueException.java

    package com.javajeff.cds;

    public class EmptyQueueException extends RuntimeException {

    }

    El siguiente listado presenta una implementacin de Queue para una cola circular basada en un array uni-

    dimensional:

    // ArrayCircularQueue.java

    package com.javajeff.cds;

    public class ArrayCircularQueue implements Queue {

    private int front = 0, rear = 0;

    private Object [] queue;

    public ArrayCircularQueue (int maxElements) {

    queue = new Object [maxElements];

    }

    public void insert (Object o) {

    int temp = rear;

    rear = (rear + 1) % queue.length;

    if (front == rear) {

    rear = temp;

    throw new FullQueueException ();

    }

    queue [rear] = o;

    }

    public boolean isEmpty () {

    return front == rear;}

    public boolean isFull () {

    return ((rear + 1) % queue.length) == front;

    }

    public Object remove () {

    if (front == rear)

    throw new EmptyQueueException ();

    front = (front + 1) % queue.length;

    return queue [front];

    }

    }

    ArrayCircularQueue revela una implementacin, en terminos de variables privadas y un constructor,

    muy similar a ArrayLinearQueue. El mtodo insert(Object o) es interesante porque guarda el

    valor actual de rear antes de hacer que esa variable apunte a la siguiente posicin. Si la cola circular est

    llena, rear restaura su valor original antes de lanzar una FullQueueException. La restauracin de

    rear es necesaria porque front es igual a rear (en ese punto), y una subsecuente llamada a remove()

    resulta en la lanzamiento de una EmptyQueueException (incluso aunque la cola circular no est vaca).

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    31/48

    Despus de estudiar el cdigo del interface y de varias clases que lo implementan basndose en arrays uni-dimensionales, consideremos en el siguiente listado una aplicacin que demuestra las colas lineales ycirculares:

    // QueueDemo.java

    import com.javajeff.cds.*;

    class QueueDemo {

    public static void main (String [] args) {

    System.out.println ("ArrayLinearQueue Demo");

    System.out.println ("---------------------");

    queueDemo (new ArrayLinearQueue (5));

    System.out.println ("ArrayCircularQueue Demo");

    System.out.println ("---------------------");

    queueDemo (new ArrayCircularQueue (6)); // Need one more slot

    because

    // of empty slot in

    circular

    // implementation

    }

    static void queueDemo (Queue q) {

    System.out.println ("Is empty = " + q.isEmpty ());

    System.out.println ("Is full = " + q.isFull ());

    System.out.println ("Inserting \"This\"");

    q.insert ("This");

    System.out.println ("Inserting \"is\"");

    q.insert ("is");

    System.out.println ("Inserting \"a\"");

    q.insert ("a");

    System.out.println ("Inserting \"sentence\"");

    q.insert ("sentence");

    System.out.println ("Inserting \".\"");

    q.insert (".");

    try {

    System.out.println ("Inserting \"One last item\"");

    q.insert ("One last item");

    }

    catch (FullQueueException e) {

    System.out.println ("One insert too many");

    System.out.println ("Is empty = " + q.isEmpty ());System.out.println ("Is full = " + q.isFull ());

    }

    System.out.println ();

    while (!q.isEmpty ())

    System.out.println (q.remove () + " [Is empty = " +

    q.isEmpty () +

    ", Is full = " + q.isFull () + "]");

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    32/48

    try {

    q.remove ();

    }

    catch (EmptyQueueException e) {

    System.out.println ("One remove too many");

    }

    System.out.println ();}

    }

    Cuando se ejecuta QueueDemo, se produce la siguiente salida:

    ArrayLinearQueue Demo

    ---------------------

    Is empty = true

    Is full = false

    Inserting "This"

    Inserting "is"

    Inserting "a"

    Inserting "sentence"

    Inserting "."

    Inserting "One last item"

    One insert too many

    Is empty = false

    Is full = true

    This [Is empty = false, Is full = true]

    is [Is empty = false, Is full = true]

    a [Is empty = false, Is full = true]

    sentence [Is empty = false, Is full = true]

    . [Is empty = true, Is full = true]

    One remove too many

    ArrayCircularQueue Demo

    ---------------------

    Is empty = true

    Is full = false

    Inserting "This"

    Inserting "is"

    Inserting "a"

    Inserting "sentence"

    Inserting "."

    Inserting "One last item"

    One insert too many

    Is empty = false

    Is full = true

    This [Is empty = false, Is full = false]

    is [Is empty = false, Is full = false]

    a [Is empty = false, Is full = false]

    sentence [Is empty = false, Is full = false]

    . [Is empty = true, Is full = false]

    One remove too many

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    33/48

    Publicado por:Alberto de la Torre

    Recomendara un amigo

    Compartiren redes

    Comentarios

    Buscar...

    BBDD Entornos de desarrollo Entretenimiento

    Herramientas

    Internet Lenguajes de script

    Lenguajes imperativos

    Lenguajes orientados a objeto Otros lenguajes

    Plataformas

    Teora Varios

    ltimas noticias

    IBM Global Entrepreneur Program: una solucin para poner en marcha tu start up

    SEO Administrator

    Presentacin de Play framework 2.0Anuncio de Play! framework 2.0 en espaol

    Ver ms

    ltimos artculos

    Entity Framework Code First (4)Entity Framework Code First (3)Entity Framework Code First (2)Entity Framework Code First (1)

    Ver ms

    ltimos cdigos

    MessageBox sencillo con JQuery UIMascara para Text (SWT)Convierte cursor de lectura en cursor de escrituraTres en Raya o Juego del Gato

    Ver ms

    http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/noticia/ibm_global_entrepreneur_program:_una_solucion_para_poner_en_marcha_tu_start_up_2074http://www.programacion.com/noticia/ibm_global_entrepreneur_program:_una_solucion_para_poner_en_marcha_tu_start_up_2074http://www.programacion.com/noticia/ibm_global_entrepreneur_program:_una_solucion_para_poner_en_marcha_tu_start_up_2074http://www.programacion.com/noticia/seo_administrator_2073http://www.programacion.com/noticia/seo_administrator_2073http://www.programacion.com/noticia/seo_administrator_2073http://www.programacion.com/noticia/presentacion_de_play_framework_2_0_2072http://www.programacion.com/noticia/presentacion_de_play_framework_2_0_2072http://www.programacion.com/noticia/presentacion_de_play_framework_2_0_2072http://www.programacion.com/noticia/anuncio_de_play_framework_2_0_en_espanol_2071http://www.programacion.com/noticia/anuncio_de_play_framework_2_0_en_espanol_2071http://www.programacion.com/noticia/anuncio_de_play_framework_2_0_en_espanol_2071http://www.programacion.com/noticiashttp://www.programacion.com/articulo/entity_framework_code_first_4_873http://www.programacion.com/articulo/entity_framework_code_first_4_873http://www.programacion.com/articulo/entity_framework_code_first_4_873http://www.programacion.com/articulo/entity_framework_code_first_3_872http://www.programacion.com/articulo/entity_framework_code_first_3_872http://www.programacion.com/articulo/entity_framework_code_first_3_872http://www.programacion.com/articulo/entity_framework_code_first_2_871http://www.programacion.com/articulo/entity_framework_code_first_2_871http://www.programacion.com/articulo/entity_framework_code_first_2_871http://www.programacion.com/articulo/entity_framework_code_first_1_870http://www.programacion.com/articulo/entity_framework_code_first_1_870http://www.programacion.com/articulo/entity_framework_code_first_1_870http://www.programacion.com/articuloshttp://www.programacion.com/codigo/messagebox_sencillo_con_jquery_ui_218http://www.programacion.com/codigo/messagebox_sencillo_con_jquery_ui_218http://www.programacion.com/codigo/messagebox_sencillo_con_jquery_ui_218http://www.programacion.com/codigo/mascara_para_text_swt_140http://www.programacion.com/codigo/mascara_para_text_swt_140http://www.programacion.com/codigo/mascara_para_text_swt_140http://www.programacion.com/codigo/convierte_cursor_de_lectura_en_cursor_de_escritura_138http://www.programacion.com/codigo/convierte_cursor_de_lectura_en_cursor_de_escritura_138http://www.programacion.com/codigo/convierte_cursor_de_lectura_en_cursor_de_escritura_138http://www.programacion.com/codigo/tres_en_raya_o_juego_del_gato_137http://www.programacion.com/codigo/tres_en_raya_o_juego_del_gato_137http://www.programacion.com/codigo/tres_en_raya_o_juego_del_gato_137http://www.programacion.com/codigoshttp://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/feeds_rss/rsscode.xmlhttp://www.programacion.com/feeds_rss/rssarticle.xmlhttp://www.programacion.com/feeds_rss/rssnew.xmlhttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/6http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/4http://www.programacion.com/codigoshttp://www.programacion.com/codigo/tres_en_raya_o_juego_del_gato_137http://www.programacion.com/codigo/convierte_cursor_de_lectura_en_cursor_de_escritura_138http://www.programacion.com/codigo/mascara_para_text_swt_140http://www.programacion.com/codigo/messagebox_sencillo_con_jquery_ui_218http://www.programacion.com/articuloshttp://www.programacion.com/articulo/entity_framework_code_first_1_870http://www.programacion.com/articulo/entity_framework_code_first_2_871http://www.programacion.com/articulo/entity_framework_code_first_3_872http://www.programacion.com/articulo/entity_framework_code_first_4_873http://www.programacion.com/noticiashttp://www.programacion.com/noticia/anuncio_de_play_framework_2_0_en_espanol_2071http://www.programacion.com/noticia/presentacion_de_play_framework_2_0_2072http://www.programacion.com/noticia/seo_administrator_2073http://www.programacion.com/noticia/ibm_global_entrepreneur_program:_una_solucion_para_poner_en_marcha_tu_start_up_2074http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/xinha_editor.html/
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    34/48

    Copyright 1998-2011 Programacin en Castellano. Todos los derechos reservadosDatos legales | Politica de privacidad | Contacte con nosotros | Publicidad

    Diseo web y desarrollo web. Un proyecto de los hermanos Carrero.

    Red internet: Juegos gratis | Servidores dedicadosMs internet: Password | Directorio de weblogs | Favicon

    http://www.programacion.com/codigoshttp://www.programacion.com/datos_legaleshttp://www.programacion.com/politica_de_privacidadhttp://www.programacion.com/contactohttp://www.programacion.com/publicidadhttp://www.colorvivo.com/http://www.carrero.es/http://www.carrero.es/http://www.carrero.es/http://www.hostalia.com/dedicados/http://password.es/http://www.bitadir.com/http://genfavicon.com/http://genfavicon.com/http://www.bitadir.com/http://password.es/http://www.hostalia.com/dedicados/http://www.carrero.es/http://www.carrero.es/http://www.carrero.es/http://www.carrero.es/http://www.colorvivo.com/http://www.programacion.com/publicidadhttp://www.programacion.com/contactohttp://www.programacion.com/politica_de_privacidadhttp://www.programacion.com/datos_legales
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    35/48

    Inicio

    Noticias

    Articulos

    Cdigo

    Foros

    Enlaces

    Hosting

    Anuncios

    Categoras destacadas

    Artculo

    InicioArtculoLenguajes orientados a objetoJavaJ2EE

    20votar! Estructuras de Datos y Algoritmos en Java

    Pilas y Colaso Pilas que "Recuerdan"o Priorizar con Colas

    http://www.programacion.com/http://www.programacion.com/http://www.programacion.com/noticiashttp://www.programacion.com/noticiashttp://www.programacion.com/articuloshttp://www.programacion.com/articuloshttp://www.programacion.com/codigoshttp://www.programacion.com/codigoshttp://www.programacion.com/foroshttp://www.programacion.com/foroshttp://www.programacion.com/direccioneshttp://www.programacion.com/direccioneshttp://www.hostalia.com/http://www.hostalia.com/http://www.programacion.com/tablonhttp://www.programacion.com/tablonhttp://www.programacion.com/http://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/bases-de-datoshttp://www.programacion.com/asphttp://www.programacion.com/javahttp://www.programacion.com/phphttp://www.programacion.com/registrohttp://www.programacion.com/loginhttp://www.programacion.com/http://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#52_colashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#51_pilashttp://www.programacion.com/articulo/estructuras_de_datos_y_algoritmos_en_java_309/5#pag5http://www.programacion.com/articulo/j2eehttp://www.programacion.com/articulo/poohttp://www.programacion.com/articulo/poohttp://www.programacion.com/http://www.programacion.com/http://www.programacion.com/tablonhttp://www.programacion.com/tablonhttp://www.hostalia.com/http://www.hostalia.com/http://www.programacion.com/direccioneshttp://www.programacion.com/direccioneshttp://www.programacion.com/foroshttp://www.programacion.com/foroshttp://www.programacion.com/codigoshttp://www.programacion.com/codigoshttp://www.programacion.com/articuloshttp://www.programacion.com/articuloshttp://www.programacion.com/noticiashttp://www.programacion.com/noticiashttp://www.programacion.com/http://www.programacion.com/
  • 8/2/2019 Estructura de DAtos --Listas.pilas

    36/48

    Pilas y Colas

    Los desarrolladores utilizan los arrays y las variantes de listas enlazadas para construir una gran variedad deestructuras de datos complejas. Este pgina explora dos de esas estructuras: las Pilas, las Colas . Cuandopresentemos los algoritmos lo haremos ncamente en cdigo Java por motivos de brevedad.

    Pilas que "Recuerdan"

    La Pilaes una estrucutra de datos donde las inserciones y recuperaciones/borrados de datos se hacen en unode los finales, que es conocido como el topde la pila. Como el ltimo elemento insertado es el primero enrecuperarse/borrarse, los desarrolladores se refieren a estas pilas como pilas LIFO (last-in, first-out).

    Los datos se push(insertan) dentro y se pop(recuperan/borran) de la parte superior de la pila. La siguientefigura ilustra una pila con tres String cada uno insertado en la parte superior de la pila:

    Como muestra la figura anterior, las pilas se construyen en memoria. Por cada dato insertado, el itm superioranterior y todos los datos inferiores se mueven hacia abajo. Cuando llega el momento de sacar un tem de lapila, se recpupera y se borra de la pila el tem superior (que en la figura anterior se revela como "third").

    Las pilas son muy tiles en varios escenarios de programacin. Dos de los ms comunes son:

    Pilas que contienen direcciones de retorno:Cuando el cdigo llama a un mtodo, la direccin de la primera instruccin que sigue a lallamada se inserta en la parte superior de la pila de llamadas de mtodos del thread actual.Cuando el mtodo llamado ejecuta la instruccin return, se saca la direccin de la partesuperior de la pila y la ejecucin contina en sa direccin. Si un mtodo llama a otro mtodo, elcomportamiento LIFO de la pila asegura que la instruccin return del segundo mtodo

    transfiere la ejecucin al primer mtodo, y la del primer mtodo transfiere la ejecucin al cdigo

    que sigue al cdigo que llam al primer mtodo. Como resultado una pila "recuerda" lasdirecciones de retorno de los mtodos llamados.

    Pilas que contienen todos los parmetros del mtodo llamado y las variables locales:Cuando se llama a un mtodo, la JVM reserva memoria cerca de la direccin de retorno yalmacena todos los parmetros del mtodo llamado y las variables locales de ese mtodo. Si elmtodo es un mtodo de ejemplar, uno de los parmetros que almacena en la pila es lareferencia this del objeto actual.

    Es muy comn implementar una pila utilizando un array uni-dimensional o una lista de enlace simple. En elescenario del array uni-dimensional, una variable entera, tpicamente llamada top, contiene el ndice de la

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    37/48

    parte superior de la pila. De forma similar, una variable de referencia, tambin nombrada noramlmente comotop, referencia el nodo superior del escenario de la lista de enlace simple.

    He modelado mis implementaciones de pilas despus de encontrar la arquitectura del API Collections de Java.Mis implementaciones constan de un interface Stack para una mxima flexibilidad, las clases de

    implementacin ArrayStack y LinkedListStack, y una clase de soporte FullStackException.

    Para facilitar su distribucin, he empaquetado estas clases en un paquete llamado com.javajeff.cds,donde cds viene de estructura de datos complejas. El siguiente listado presenta el interface Stack:

    // Stack.java

    package com.javajeff.cds;

    public interface Stack {

    boolean isEmpty ();

    Object peek ();

    void push (Object o);

    Object pop ();

    }

    Sus cuatro mtodos determinan si la pila est vaca, recuperan el elemento superior sin borrarlo de la pia,situan un elemento en la parte superior de la pila y el ltimo recuera/borra el elemento superior. Aparte de unconstructor especfico de la implementacin, su programa nicamente necesita l lamar a estos mtodos.

    El siguiente listado presenta una implementacin de un Stack basado en un array uni-dimensional:

    // ArrayStack.java

    package com.javajeff.cds;

    public class ArrayStack implements Stack {

    private int top = -1;

    private Object [] stack;

    public ArrayStack (int maxElements) {

    stack = new Object [maxElements];

    }

    public boolean isEmpty () {

    return top == -1;

    }

    public Object peek () {

    if (top < 0)

    throw new java.util.EmptyStackException ();

    return stack [top];

    }

    public void push (Object o) {

    if (top == stack.length - 1)

    throw new FullStackException ();

    stack [++top] = o;

    }

    public Object pop () {

    if (top < 0)

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    38/48

    throw new java.util.EmptyStackException ();

    return stack [top--];

    }

    }

    ArrayStack revela una pila como una combinacin de un ndice entero privado top y variables de

    referencia de un array uni-dimensional stack. top identifica el elemento superior de la pila y lo inicializa a -1 para indica que la pila est vaca. Cuando se crea un objeto ArrayStack llama a public

    ArrayStack(int maxElements) con un valor entero que representa el nmero mximo de elementos.

    Cualquier intento de sacar un elemento de una pila vaca mediante pop() resulta en el lanzamiento de una

    java.util.EmptyStackException. De forma similar, cualquier intento de poner ms elementos de

    maxElements dentro de la pila utilizando push(Object o) lanzar una FullStackException,

    cuyo cdigo aparece en el siguiente listado:

    // FullStackException.java

    package com.javajeff.cds;

    public class FullStackException extends RuntimeException {

    }

    Por simetra con EmptyStackException, FullStackException extiende RuntimeException.

    Como resultado no se necesita aadir FullStackException a la clausula throws del mtodo.

    El siguiente listado presenta una implementacin de Stack utilizando una lista de enlace simple:

    // LinkedListStack.java

    package com.javajeff.cds;

    public class LinkedListStack implements Stack {

    private static class Node {

    Object o;Node next;

    }

    private Node top = null;

    public boolean isEmpty () {

    return top == null;

    }

    public Object peek () {

    if (top == null)

    throw new java.util.EmptyStackException ();

    return top.o;

    }

    public void push (Object o) {

    Node temp = new Node ();

    temp.o = o;

    temp.next = top;

    top = temp;

    }

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    39/48

    public Object pop () {

    if (top == null)

    throw new java.util.EmptyStackException ();

    Object o = top.o;

    top = top.next;

    return o;

    }

    }

    LinkedListStack revela una pila como una combinacin de una clase anidada privada de alto nivel

    llamada Node y una variable de referencia privada top que se inicialia a null para indicar una pila vaca. Al

    contrario que su contrapartida del array uni-dimensional, LinkedListStack no necesita un constructor ya

    que se expande dinmicamente cuando se ponen los tems en la pila. As, void push(Object o) no

    necesita lanzar una FullStackException. Sin embargo, Object pop() si debe chequear si la pila

    est vaca, lo que podra resultar en el lanzamiento de una EmptyStackException.

    Ahora que ya hemos visto el interface y las tres clases que generan mis implementaciones de las pilas, juguemos un poco. El siguiente listado muestra casi todo el soporte de pilas de mi paquetecom.javajeff.cds:

    // StackDemo.java

    import com.javajeff.cds.*;

    class StackDemo {

    public static void main (String [] args) {

    System.out.println ("ArrayStack Demo");

    System.out.println ("---------------");

    stackDemo (new ArrayStack (5));

    System.out.println ("LinkedListStack Demo");

    System.out.println ("--------------------");

    stackDemo (new LinkedListStack ());

    }

    static void stackDemo (Stack s) {

    System.out.println ("Pushing \"Hello\"");

    s.push ("Hello");

    System.out.println ("Pushing \"World\"");

    s.push ("World");

    System.out.println ("Pushing StackDemo object");

    s.push (new StackDemo ());

    System.out.println ("Pushing Character object");

    s.push (new Character ('C'));

    System.out.println ("Pushing Thread object");

    s.push (new Thread ("A"));

    try {

    System.out.println ("Pushing \"One last item\"");

    s.push ("One last item");

    }

    catch (FullStackException e) {

    System.out.println ("One push too many");

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    40/48

    }

    System.out.println ();

    while (!s.isEmpty ())

    System.out.println (s.pop ());

    try {

    s.pop ();}

    catch (java.util.EmptyStackException e) {

    System.out.println ("One pop too many");

    }

    System.out.println ();

    }

    }

    Cuando se ejecuta StackDemo, produce la siguiente salida:

    ArrayStack Demo

    ---------------

    Pushing "Hello"

    Pushing "World"

    Pushing StackDemo object

    Pushing Character object

    Pushing Thread object

    Pushing "One last item"

    One push too many

    Thread[A,5,main]

    C

    StackDemo@7182c1

    World

    Hello

    One pop too many

    LinkedListStack Demo

    --------------------

    Pushing "Hello"

    Pushing "World"

    Pushing StackDemo object

    Pushing Character object

    Pushing Thread object

    Pushing "One last item"

    One last item

    Thread[A,5,main]

    C

    StackDemo@cac268

    World

    Hello

    One pop too many

    Priorizar con Colas

  • 8/2/2019 Estructura de DAtos --Listas.pilas

    41/48

    La Cola es una estructura de datos donde la insercin de tem se hace en un final (el fin de la cola) y la

    recuperacin/borrado de elementos se hace en el otro final (el inicio de la cola). Como el primer elementoinsertado es el primero en ser recuperado, los desarrolladores se refieren a estas colas como estructuras FIFO(first-in, first-out).

    Normalmente los