2011-07-16 16 views
12

Creo que son muy similares ... ¿Y cuándo necesitamos usar la pila o la cola, por qué no simplemente usar ArrayList o LinkedList para reemplazarlos?¿por qué Stack es una clase mientras Queue es una interfaz?

+1

Debería leer un buen libro de estructuras de datos. En pocas palabras: las restricciones pueden mejorar el rendimiento y aumentar la simplicidad de la comprensión del código. –

+2

Porque los diseñadores de Java apestan en las API. Stack ** debe ** haber sido una interfaz, por lo que puede haber diferentes implementaciones de stacks. Por ejemplo, una pila basada en listas de arreglos y una pila basada en listas enlazadas. En su lugar, tomaron un atajo y subclasificaron Vector para crear algún tipo de pila de franken que expone una gran cantidad de detalles de implementación incorrectos de su principal. Hicieron un intento de corregir esto creando un Deque (es decir, otra implementación de pila) pero solo crearon más confusión. –

Respuesta

6

Stack, es una pila de objetos Last-In-First-Out derivada de Vector, también una clase. Vector va con el "viejo" conjunto de colecciones que Java originalmente envió, y deriva en última instancia de AbstractCollection. De nota, hay realmente una implementación canónica de Stack; Queue sy List s tienen muchas implementaciones bien conocidas que pueden hacer una diferencia de rendimiento sustancial cuando se eligen correctamente.

Queue Por otro lado, sigue la interfaz Collection del "nuevo" conjunto de colecciones que se utilizan normalmente en la actualidad, por lo que sigue las interfaces y viene con una variedad de implementaciones.

Stack s se deben usar cuando se necesita semántica LIFO, mientras que Queue s se deben usar cuando se necesita la semántica Primero en entrar primero en salir.

ArrayList y LinkedList tienda ordenó colecciones de cosas, y no se alinean con los casos de uso de Stack o Queue directamente. Stack sy Queue s son, en cierto sentido, buffers de datos, mientras que la semántica de un List suele hacer que sea un almacén de datos; nada le impide usar un List para implementar un Stack o un Queue.

6

Bueno, una de las razones es que hay variantes de colas que es conveniente poder intercambiar, como las prioridades. Cumplen la misma interfaz pero se comportan de manera diferente. No creo que exista algo así para Stacks, o al menos no se usa con la misma frecuencia.

No podría simular una cola de prioridad utilizando solo una ArrayList.

Además, con respecto a su segunda pregunta, probablemente debería usar una pila o cola cuando eso es lo que está usando semánticamente. Es decir, si está haciendo algo como cruce de gráficos, ayuda a ser muy explícito sobre el tipo de estructura de datos que está utilizando.

+0

Muchas gracias – Yang

Cuestiones relacionadas