c ++ deque vs queue vs stack

80

Warteschlange und Stapel sind weit verbreitete Strukturen. In C ++ können Sie die Warteschlange jedoch auf zwei Arten ausführen:

#include <queue>
#include <deque>

Aber für Stack kann man das nur so machen

#include <stack>

Meine Frage ist, was ist der Unterschied zwischen Warteschlange und Warteschlange, warum zwei Strukturen vorgeschlagen? Für Stack könnte eine andere Struktur enthalten sein?

skydoor
quelle

Antworten:

76

Moron / Aryabhatta ist korrekt, aber ein bisschen mehr Details können hilfreich sein.

Warteschlange und Stapel sind Container höherer Ebene als Deque, Vektor oder Liste. Damit meine ich, dass Sie eine Warteschlange oder einen Stapel aus den Containern der unteren Ebene erstellen können.

Zum Beispiel:

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

Erstellt einen Stapel von Ints unter Verwendung einer Deque als zugrunde liegenden Container und einer Warteschlange von Doubles unter Verwendung einer Liste als zugrunde liegenden Container.

Sie können sich seine eingeschränkte Deque und qeine eingeschränkte Liste vorstellen .

Alles, was notwendig ist, ist, dass der Container der unteren Ebene die Methoden implementiert, die der Container der höheren Ebene benötigt. Diese sind back(), push_back()und pop_back()für Stapel und front(), back(), push_back()und pop_front()für die Warteschlange.

Weitere Informationen finden Sie unter Stapel und Warteschlange .

In Bezug auf die Deque ist es viel mehr als eine Warteschlange, in die Sie an beiden Enden einfügen können. Insbesondere hat es den wahlfreien Zugriff operator[]. Dies macht es eher zu einem Vektor, aber zu einem Vektor, in den Sie am Anfang mit push_front()und einfügen und löschen können pop_front().

Siehe deque für Details.

Andrew Stein
quelle
15
stackund queue nur deque von seinem vollen Funktionsumfang einschränken .
Bobobobo
59

Queue: Sie können nur an einem Ende einfügen und am anderen entfernen.

Deque: Sie können an beiden Enden einfügen und entfernen.

Mit a Dequekönnen Sie also sowohl a Queueals auch a modellieren Stack.

Hinweis:
Dequesteht für " D ouble e nded que ue".

ahmednabil88
quelle
4
Wird es nicht übertrieben, wenn Sie einen Deque verwenden, um einen Stapel zu modellieren?
Skydoor
Sie können einen Stapel nicht mit einer Warteschlange modellieren.
R Samuel Klatchko
1
Es gibt viel mehr Unterschiede. queueerfüllt nicht die Anforderungen eines Containers. Es gibt keine Iteratoren, um Himmels willen!
Potatoswatter
@skydoor Von allen Standard-Bibliothekscontainern ist die Deque wohl die mit dem geringsten Overhead.
3
@skydoor: Genau wie zu Ihrer Information verwenden die STLs std::stackstandardmäßig a std::dequeals Hintergrundcontainer. Ich spekuliere hier über den Grund: stackoverflow.com/questions/102459/… (im Grunde genommen ist das Wachsen von a ein dequegeringer Overhead).
Michael Burr
32

dequeist eine Containervorlage. Es erfüllt die Anforderungen für eine Sequenz mit Iteratoren mit wahlfreiem Zugriff, ähnlich wie a vector.

queueist überhaupt kein Container, es ist ein Adapter . Es enthält einen Container und bietet eine andere, spezifischere Schnittstelle. Verwenden queueSie diese Option, wenn Sie sich erinnern (oder daran erinnern) möchten, um Operationen neben push[_back]und pop[_front], frontund back, sizeund zu vermeiden empty. Sie können Elemente queueneben dem ersten und dem letzten überhaupt nicht betrachten!

Kartoffelklatsche
quelle
7
Adapter - mit anderen Worten unnötige Funktionalität Crippler , aber Adapter ist in Ordnung
Bobobobo
22

In der C ++ Bibliothek, die beide std::stackund std::queuewerden als Container umgesetzt Adapter . Das heißt, sie stellen die Schnittstelle eines Stapels bzw. einer Warteschlange bereit, aber keiner ist wirklich ein Container für sich. Stattdessen verwenden sie einen anderen Container (z. B. std::dequeoder std::listum die Daten tatsächlich zu speichern), und die std::stackKlasse verfügt nur über ein kleines Stück Code zum Übersetzen pushund popzu push_backund pop_back(und std::queuetut ungefähr das Gleiche, verwendet jedoch push_backund pop_front).

Jerry Sarg
quelle
Für ein queuescheint VS auch zur Karte popzu pop_frontund pushzu push_back, so dass ich denke , das ist die Umsetzung abhängig ist.
Chappjc
@chappjc: Nein - erneut überprüfen, nur mein Gedächtnis war aus. pop_frontund push_backsind was erforderlich. Entschuldigen Sie.
Jerry Coffin
6

Eine Deque ist eine Warteschlange mit zwei Enden, die ein einfaches Einfügen / Entfernen an beiden Enden ermöglicht. Warteschlangen ermöglichen nur das Einfügen an einem Ende und das Abrufen vom anderen.

Michael Hackner
quelle
5

deque unterstützt Insert / Pop von hinten und vorne

Die Warteschlange unterstützt nur das Einfügen nach hinten und das Einfügen von vorne. Sie wissen, ein FIFO (first in first out).

rmn
quelle
0

Das Entfernen der Prioritätswarteschlange erfolgt gemäß einem Vergleich der Reihenfolge (Priorität), nicht gemäß der Reihenfolge der Warteschlange.

Beispielsweise können Sie zeitgesteuerte Ereignisse in einem speichern, in dem Sie das früheste Ereignis zuerst abrufen und die geplante Zeit abfragen möchten, damit Sie bis zu diesem Zeitpunkt schlafen können.

Prioritätswarteschlangen werden häufig mithilfe von Heaps implementiert.

von Mike Anderson hier: https://www.quora.com/Was-ist-der- Unterschied zwischen-a-priority-queue-and-a-
queue

Stich
quelle
0

In deque (Warteschlange mit zwei Enden) Das Element kann von hinten eingefügt und vom Formular entfernt werden (wie Stapel). In der Warteschlange kann es jedoch nur von vorne entfernt werden.

Nagappa
quelle
Diese Antwort fügt dem Thema nichts Neues hinzu (und die meisten Antworten stammen aus dem Jahr 2010)
Barbansan
-1

Eine Deque hat zwei Enden. Eine Warteschlange ist nicht.

Skilldrick
quelle