Deque
# Deque

Ein Deque (Double-ended queue, sprich: „Deck“) bezeichnet eine Datenstruktur der Informatik.
Hierbei handelt es sich um eine Datenstruktur ähnlich der Warteschlange oder des Stapelspeichers. Es kombiniert die Eigenschaften beider Datentypen. Der Unterschied besteht darin, dass die Daten an beiden Enden gelesen, eingefügt oder entfernt werden können.

## Eigenschaften

Die Operationen eines Deque, die in den Programmbibliotheken verschiedener Programmiersprachen nicht einheitlich benannt sind:
* push und pop für das Einfügen oder Entnehmen eines Elements am hinteren Ende der Deque.
* put und get für das Einfügen oder Entnehmen am vorderen Ende der Deque.
* first und last für das Lesen des ersten oder letzten Elementes, ohne es zu entfernen.
Technisch wird ein Deque als ein Array von Pointern auf einzelne Chunks mit jeweils gleicher Größe realisiert. Damit ist gesichert, dass der wahlfreie Zugriff mit konstanter Zeit erfolgen kann, was der C++-Standard verlangt. Durch die jeweils gleiche Größe der Chunks lässt sich deren Position für den indizierten Zugriff (Operator) schnell berechnen. Dies wäre mit einer verketteten Liste nicht möglich. Dadurch, dass jeweils mehrere Elemente in einen Chunk passen ist das Einfügen und Entfernen an den Enden schneller als bei einer Liste da für so viele Elemente die in einen Chunk passen genau eine Speicherallokation erforderlich ist.
Deques sind Sequenzcontainer mit dynamischen Größen, die an beiden Enden (entweder vorne oder hinten) erweitert oder verkleinert werden können. Bestimmte Programmbibliotheken können Deques auf unterschiedliche Weise implementieren, im Allgemeinen als eine Form eines dynamischen Arrays. In jedem Fall ermöglichen sie jedoch den direkten Zugriff auf die einzelnen Elemente über Iteratoren mit wahlfreiem Zugriff, wobei der Speicher automatisch verwaltet wird, indem der Container nach Bedarf erweitert und verkleinert wird.
Daher bieten sie eine ähnliche Funktionalität wie Arrays, jedoch mit effizienter Einfügung und Löschung von Elementen auch am Anfang der Sequenz und nicht nur am Ende. Im Gegensatz zu Arrays wird jedoch nicht garantiert, dass Deques alle ihre Elemente an zusammenhängenden Speicheradressen speichern: Der Zugriff auf Elemente in einer Deque durch Versetzen eines Zeigers auf ein anderes Element führt zu undefiniertem Verhalten. Sowohl dynamischen Arrays als auch Deques bieten eine sehr ähnliche Schnittstelle und können für ähnliche Zwecke verwendet werden, aber intern funktionieren beide auf ganz unterschiedliche Weise: Während Vektoren ein einzelnes Array verwenden, das gelegentlich für das Wachstum neu zugewiesen werden muss, können die Elemente eines Deque auf verschiedene Speicherblöcke verstreut werden, wobei der Container die erforderlichen Informationen intern speichert, um in konstanter Laufzeit und mit einer einheitlichen sequentiellen Schnittstelle (über Iteratoren) direkten Zugriff auf eines seiner Elemente zu ermöglichen.
Daher sind Deques intern etwas komplexer, aber dies ermöglicht es ihnen, unter bestimmten Umständen effizienter zu wachsen, insbesondere bei sehr langen Sequenzen, bei denen Neuzuweisungen teurer werden. Bei Operationen, bei denen Elemente häufig an anderen Positionen als am Anfang oder am Ende eingefügt oder entfernt werden, sind Deques schlechter und weisen weniger konsistente Iteratoren und Referenzen auf als Listen.
In der Praxis verwendet man die Deque unter anderem zur Implementierung von nichtdeterministischen endlichen Automaten und zur Textsuche mittels regulärer Ausdrücke (Pattern-Matching-Algorithmus).

## Programmierung

Das folgende Beispiel in der Programmiersprache C++ mit Spielkarten zeigt die Verwendung der Klasse deque der C++-Standardbibliothek (siehe auch Template (C++) - Klassen-Templates). Bei der Ausführung des Programms wird die Methode main verwendet.
Für die Ausgabe des Deque wird folgende Methode verwendet:
Für die Programmierung von Kartenspielen und Gesellschaftsspielen mit Stapeln, bei denen während des Spiels Karten auf einen Stapel gelegt oder von einem Stapel gezogen wird, sind stattdessen Stacks geeignet (siehe Stapelspeicher - Beispiel mit Spielkarten).