2008-11-19 25 views
28

Estoy buscando en el marco Colecciones de Java para una estructura LIFO (pila) sin éxito. Básicamente quiero una pila realmente simple; mi opción perfecta sería un Deque, pero estoy en Java 1.5.Colecciones Java (estructura LIFO)

me gustaría no tener que agregar otra clase de mi estructura, pero me pregunto si eso es posible:

  1. ¿Hay alguna clase en el marco de las colecciones (1.5) que hace el trabajo?

  2. Si no, ¿hay alguna manera de convertir una cola en una cola LIFO (también conocida como pila) sin volver a implementarla?

  3. En caso negativo, ¿qué interfaz o clase debo extender para esta tarea? Supongo que mantener el camino que los tipos de Sun han hecho con el Deque es un buen comienzo.

Muchas gracias.

EDIT: Olvidé decir sobre la clase Stack: tengo mis dudas sobre esta clase cuando vi que implementa la clase Vector, y la clase Vector es un poco obsoleta, ¿no?

+2

El problema principal con Vector es que todo el acceso está sincronizado, lo necesite o no. Es tan "actualizado" como cualquiera de las otras colecciones, pero obtuvo una mala reputación debido al problema de sincronización. –

Respuesta

46

De hecho, hay una clase de pila: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Stack.html

Si no desea utilizar eso, la clase LinkedList (http://java.sun.com/j2se/1.5.0/docs/api/java/util/LinkedList.html) tiene addFirst y addLast y removeFirst y removeLast métodos, por lo que es perfecto para su uso como una pila o clase de cola.

+4

LinkedList también proporciona la definición de Deque, que es su colección deseada. –

+1

Sí, creo que LinkedList es el que estaba buscando, porque en mi primera consulta no me di cuenta de los métodos Addfirst y removeFirst. Muchas gracias. –

+0

único problema es que Deque se implementó en API Nivel 9 .... – Necronet

6

Hay un Stack class in the API. ¿Esto satisfará tus necesidades?

+0

Lo siento, me olvidé de decir acerca de la clase de pila y mi opinión al respecto, pero estoy pensando que probablemente sea una mejor solución que implementar mi propia clase. ¿no? –

+5

No use la clase Stack. Extiende Vector, que se conserva solo por compatibilidad con versiones anteriores. – erickson

8

Pila clase es lenta: métodos están sincronizadas + Stac k se extiende sincronizado vector

5

Si bien esto se le preguntó hace un tiempo que podría ser aconsejable proporcionar una respuesta JDK6 +, que ahora ofrece una interfaz (cubierta) Deque que se realiza mediante la estructura de datos ArrayDeque y la LinkedList fue actualizado para implementar este interfaz. También existen formularios especializados para el acceso concurrente y están implementados por ConcurrentLinkedDeque y LinkedBlockingDeque.

Lo bueno de una deque es que proporciona compatibilidad con LIFO (pila) y FIFO (cola), ya que puede causar confusión en cuanto a qué métodos son para operaciones de cola y cuáles son para operaciones de pila para recién llegados.

mi humilde opinión el JDK debe tener una interfaz Stack y una interfaz de Queue que aún podría ser implementado por los gustos de ArrayDeque pero sólo exponer el subconjunto de métodos necesarios para que la estructura, es decir,LIFO podría definir pop(), push() y peek(), a continuación, en el contexto de

LIFO<String> stack = new ArrayDeque<>(); 

única pila operaciones están expuestas que se detiene a alguien accidentalmente llamar add(E) cuando push(E) que se pretendía.

-1

Solo para completar, proporciono un ejemplo Dequeue y un LinkedList puro.

Mediante la interfaz de quitar de la cola en combinación con un LinkedList (recomendado):

Deque<String> dequeue = new LinkedList<>(); 
    dequeue.add("first"); 
    dequeue.add("last"); 

    // returns "last" without removing it 
    System.out.println(dequeue.peekLast()); 

    // removes and returns "last" 
    System.out.println(dequeue.pollLast()); 

Copia de seguridad de un quitar de la cola por un LinkedList es grande para el rendimiento, ya que la inserción y eliminación de elementos de ella se realiza en un tiempo constante (O (1)).

El uso de un solo LinkedList:

LinkedList<String> list = new LinkedList<>(); 
    list.add("first"); 
    list.add("last"); 

    // returns "last" without removing it 
    System.out.println(list.getLast()); 

    // removes and returns "last" 
    System.out.println(list.removeLast()); 
+0

La publicación original usaba una cola que obviamente era FIFO y no LIFO, así que actualicé mi respuesta. – Ivo

-1

respuesta más simple sería utilizar un ArrayList, y sólo tiene que añadir objetos en el índice 0.

List<String> arrayList = new ArrayList<>(); 
arrayList.add(0, "three"); 
arrayList.add(0, "two"); 
arrayList.add(0, "one"); 

// Prints: [one, two, three] 
System.out.println(arrayList); 

agregar objetos en el índice 0 se agregará a la parte superior de la lista, y cambia el resto de la lista. Ahora tiene una estructura de datos LIFO simple y funcional.

EDITAR: Usar una lista enlazada es más rápido que usar una lista de arreglos. Entonces, usar LinkedList.addFirst() es mejor.

+1

Esta no es una buena idea para el rendimiento, debido a los cambios. Una LinkedList haría un trabajo mucho mejor aquí. – Ivo