c ++ deque vs cola vs pila


82

Queue y Stack son estructuras ampliamente mencionadas. Sin embargo, en C ++, para la cola puedes hacerlo de dos formas:

#include <queue>
#include <deque>

pero para apilar solo puedes hacerlo así

#include <stack>

Mi pregunta es, ¿cuál es la diferencia entre cola y deque, por qué se proponen dos estructuras? Para pila, ¿se podría incluir alguna otra estructura?

Respuestas:


77

Moron / Aryabhatta tiene razón, pero un poco más de detalle puede ser útil.

La cola y la pila son contenedores de nivel superior que deque, vector o list. Con esto, quiero decir que puede crear una cola o apilar los contenedores de nivel inferior.

Por ejemplo:

  std::stack<int, std::deque<int> > s;
  std::queue<double, std::list<double> > q;

Construirá una pila de entradas usando una deque como contenedor subyacente y una cola de dobles usando una lista como contenedor subyacente.

Puede pensar sen una deque restringida y qcomo una lista restringida.

Todo lo que se necesita es que el contenedor de nivel inferior implemente los métodos que necesita el contenedor de nivel superior. Estos son back(), push_back()y pop_back()para la pila y front(), back(), push_back(), ypop_front() para la cola.

Consulte pila y cola para obtener más detalles.

Con respecto a la deque, es mucho más que una cola donde se puede insertar en ambos extremos. En particular, tiene acceso aleatorio operator[]. Esto lo hace más como un vector, pero un vector donde puede insertar y eliminar al principio con push_front()y pop_front().

Consulte la etiqueta para obtener más detalles.


16
stacky queue simplemente restringir deque su conjunto completo de funciones.
bobobobo

59

Queue: puede insertar solo en un extremo y quitar del otro.

Deque: puede insertar y quitar de ambos extremos.

Entonces, usando a Deque, puede modelar Queuetanto a como a Stack.

Sugerencia:
Dequees la abreviatura de " D OBLE e nded Que ue".


4
¿No será exagerado si usas un Deque para modelar una pila?
Skydoor

No puedes modelar una pila con una cola.
R Samuel Klatchko

1
Hay muchas más diferencias. queueno satisface los requisitos de un contenedor. No tiene iteradores, ¡por el amor de Dios!
Potatoswatter

@skydoor De todos los contenedores de bibliotecas estándar, el deque es posiblemente el que tiene la sobrecarga más baja.

3
@skydoor: al igual que un FYI, el STL std::stackutiliza a std::dequecomo contenedor de respaldo de forma predeterminada. Especulo sobre la razón aquí: stackoverflow.com/questions/102459/… (básicamente, el crecimiento de a dequees una sobrecarga baja).
Michael Burr

33

dequees una plantilla de contenedor. Satisface los requisitos para una secuencia con iteradores de acceso aleatorio, muy parecido a un vector.

queueno es un contenedor en absoluto, es un adaptador . Contiene un contenedor y proporciona una interfaz diferente y más específica. Úselo queuecuando desee recordar (o recordar) para evitar operaciones además de push[_back]y pop[_front], fronty back, sizey empty. ¡No puedes mirar los elementos dentro del queueademás del primero y el último, en absoluto!


7
Adaptador - en otras palabras innecesarias crippler funcionalidad , pero el adaptador está bien
bobobobo

22

En la biblioteca de C ++, ambos std::stacky std::queuese implementan como adaptadores de contenedor . Eso significa que proporcionan la interfaz de una pila o una cola respectivamente, pero ninguno es realmente un contenedor en sí mismo. En su lugar, usan algún otro contenedor (por ejemplo, std::dequeo std::listpara almacenar realmente los datos), y la std::stackclase solo tiene un poco de código para traducir pushy pophacia push_backy pop_back(y std::queuehace aproximadamente lo mismo, pero usando push_backypop_front ).


Para una queue, VS también parece asignar popa pop_front, y pushque push_back, por lo que supongo que esto depende de la implementación.
chappjc

@chappjc: No, volviendo a verificar, solo mi memoria estaba apagada. pop_fronty push_backson lo que se requiere. Mis disculpas.
Jerry Coffin

7

Una deque es una cola de dos extremos, que permite una fácil inserción / extracción desde cualquier extremo. Las colas solo permiten la inserción en un extremo y la recuperación del otro.


5

deque admite insertar / pop desde atrás y adelante

la cola solo admite insertar en la parte posterior y pop desde el frente. Ya sabes, un FIFO (primero en entrar, primero en salir).



0

La eliminación de la cola de prioridad ocurre según alguna comparación de orden (prioridad), no según el orden de puesta en cola.

Por ejemplo, puede almacenar eventos cronometrados en uno en el que desee extraer primero el evento más temprano y consultar su hora programada para que pueda dormir hasta ese momento.

Las colas de prioridad a menudo se implementan mediante montones.

por Mike Anderson aquí:
https://www.quora.com/What-is-the-difference-between-a-priority-queue-and-a-queue


0

En deque (cola de dos extremos) El elemento se puede insertar desde atrás y quitar de forma posterior (igual que la pila), pero en la cola solo se puede quitar desde el frente.


Esta respuesta no agrega nada nuevo al tema (y la mayoría de las respuestas son de 2010)
barbsan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.