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?

Skydoor
fuente

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.

Andrew Stein
fuente
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".

ahmednabil88
fuente
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!

Potatoswatter
fuente
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 ).

Jerry Coffin
fuente
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.

Michael Hackner
fuente
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).

rmn
fuente
0

Un deque tiene dos extremos. Una cola no lo es.

Skilldrick
fuente
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

Angustia
fuente
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.

Nagappa
fuente
Esta respuesta no agrega nada nuevo al tema (y la mayoría de las respuestas son de 2010)
barbsan