<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Deque</id>
	<title>Deque - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Deque"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Deque&amp;action=history"/>
	<updated>2026-05-27T01:46:51Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Deque&amp;diff=259926&amp;oldid=prev</id>
		<title>2003:C3:6711:DD00:1531:7A53:A5B9:F798: /* Programmierung */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Deque&amp;diff=259926&amp;oldid=prev"/>
		<updated>2024-08-25T22:02:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Programmierung&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Deque&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;ouble-&amp;#039;&amp;#039;&amp;#039;e&amp;#039;&amp;#039;&amp;#039;nded &amp;#039;&amp;#039;&amp;#039;que&amp;#039;&amp;#039;&amp;#039;ue&amp;#039;&amp;#039;, sprich: „Deck“) bezeichnet eine [[Datenstruktur]] der [[Informatik]].&lt;br /&gt;
&lt;br /&gt;
Hierbei handelt es sich um eine [[Datenstruktur]] ähnlich der [[Warteschlange (Datenstruktur)|Warteschlange]] oder des [[Stapelspeicher]]s. Es kombiniert die Eigenschaften beider [[Datentyp|Datentypen]]. Der Unterschied besteht darin, dass die Daten an beiden Enden gelesen, eingefügt oder entfernt werden können.&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
Die Operationen eines Deque, die in den [[Programmbibliothek|Programmbibliotheken]] verschiedener [[Programmiersprache|Programmiersprachen]] nicht einheitlich benannt sind:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;push&amp;#039;&amp;#039; und &amp;#039;&amp;#039;pop&amp;#039;&amp;#039; für das Einfügen oder Entnehmen eines Elements am hinteren Ende der Deque.&lt;br /&gt;
* &amp;#039;&amp;#039;put&amp;#039;&amp;#039; und &amp;#039;&amp;#039;get&amp;#039;&amp;#039; für das Einfügen oder Entnehmen am vorderen Ende der Deque.&lt;br /&gt;
* &amp;#039;&amp;#039;first&amp;#039;&amp;#039; und &amp;#039;&amp;#039;last&amp;#039;&amp;#039; für das Lesen des ersten oder letzten Elementes, ohne es zu entfernen.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Deques sind Sequenzcontainer mit dynamischen Größen, die an beiden Enden (entweder vorne oder hinten) erweitert oder verkleinert werden können. Bestimmte [[Programmbibliothek|Programmbibliotheken]] können Deques auf unterschiedliche Weise implementieren, im Allgemeinen als eine Form eines dynamischen [[Feld (Datentyp)|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.&lt;br /&gt;
&lt;br /&gt;
Daher bieten sie eine ähnliche Funktionalität wie [[Feld (Datentyp)|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 [[Speicheradresse|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 [[Speicherblock|Speicherblöcke]] verstreut werden, wobei der Container die erforderlichen Informationen intern speichert, um in konstanter [[Laufzeit (Informatik)|Laufzeit]] und mit einer einheitlichen sequentiellen Schnittstelle (über [[Iterator|Iteratoren]]) direkten Zugriff auf eines seiner Elemente zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
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 [[Operation (Informatik)|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 [[Iterator (Entwurfsmuster)|Iteratoren]] und [[Referenz (Programmierung)|Referenzen]] auf als [[Liste (Datenstruktur)|Listen]].&amp;lt;ref&amp;gt;www.cplusplus.com: [https://www.cplusplus.com/reference/deque/deque/ deque]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Praxis verwendet man die Deque unter anderem zur Implementierung von [[Nichtdeterministischer endlicher Automat|nichtdeterministischen endlichen Automaten]] und zur Textsuche mittels [[regulärer Ausdruck|regulärer Ausdrücke]] ([[Pattern Matching|Pattern-Matching]]-[[Algorithmus]]).&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C++]] mit Spielkarten zeigt die Verwendung der [[Klasse (Objektorientierung)|Klasse]] &amp;#039;&amp;#039;deque&amp;#039;&amp;#039; der [[C++-Standardbibliothek]] (siehe auch [[Template (C++)#Klassen-Templates|Template (C++) - Klassen-Templates]]). Bei der Ausführung des Programms wird die Methode &amp;#039;&amp;#039;main&amp;#039;&amp;#039; verwendet.&amp;lt;ref&amp;gt;Microsoft Docs: [https://docs.microsoft.com/en-us/cpp/standard-library/deque-class?view=msvc-160 deque Class]&amp;lt;/ref&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;deque&amp;gt; // Bindet den Datentyp deque in das Programm ein&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    deque&amp;lt;string&amp;gt; myDeque; // Deklariert ein Deque mit dem Elementtyp string&lt;br /&gt;
&lt;br /&gt;
    // Fügt dem Deque 3 Elemente vom Typ string am Ende hinzu&lt;br /&gt;
    myDeque.push_back(&amp;quot;Kreuz Bube&amp;quot;);&lt;br /&gt;
    myDeque.push_back(&amp;quot;Herz Dame&amp;quot;);&lt;br /&gt;
    myDeque.push_back(&amp;quot;Karo König&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Die Länge des Deque ist &amp;quot;&lt;br /&gt;
         &amp;lt;&amp;lt; myDeque.size() &amp;lt;&amp;lt; endl;    // Ausgabe Anzahl der Elemente&lt;br /&gt;
    string card = myDeque.front();     // Weist das Element am Anfang (&amp;quot;Kreuz Bube&amp;quot;) der Variablen card zu&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Die Karte am Anfang der Deque ist: &amp;quot;&lt;br /&gt;
         &amp;lt;&amp;lt; card &amp;lt;&amp;lt; endl;              // Ausgabe&lt;br /&gt;
    card = myDeque.back();             // Weist das Element am Ende (&amp;quot;Karo König&amp;quot;) der Variablen card zu&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Die Karte am Ende der Deque ist: &amp;quot;&lt;br /&gt;
         &amp;lt;&amp;lt; card &amp;lt;&amp;lt; endl;              // Ausgabe der Karte&lt;br /&gt;
    cout &amp;lt;&amp;lt; toString(myDeque) &amp;lt;&amp;lt; endl; // Ausgabe: (Kreuz Bube, Herz Dame, Karo König)&lt;br /&gt;
&lt;br /&gt;
    myDeque.push_front(&amp;quot;Kreuz 10&amp;quot;);    // Fügt 1 Element am Anfang des Deque ein&lt;br /&gt;
&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;Die Länge des Deque ist &amp;quot;&lt;br /&gt;
         &amp;lt;&amp;lt; myDeque.size() &amp;lt;&amp;lt; endl;    // Ausgabe Anzahl der Elemente &lt;br /&gt;
    cout &amp;lt;&amp;lt; toString(myDeque) &amp;lt;&amp;lt; endl; // Ausgabe: (Kreuz 10, Kreuz Bube, Herz Dame, Karo König)&lt;br /&gt;
&lt;br /&gt;
    myDeque.pop_back();                // Entfernt das Element am Ende&lt;br /&gt;
    cout &amp;lt;&amp;lt; toString(myDeque) &amp;lt;&amp;lt; endl; // Ausgabe: (Kreuz 10, Kreuz Bube, Herz Dame)&lt;br /&gt;
&lt;br /&gt;
    myDeque.push_back(&amp;quot;Karo Ass&amp;quot;);     // Fügt dem Deque 1 Element am Ende hinzu&lt;br /&gt;
    cout &amp;lt;&amp;lt; toString(myDeque) &amp;lt;&amp;lt; endl; // Ausgabe auf der Konsole: (Kreuz 10, Kreuz Bube, Herz Dame, Karo Ass)&lt;br /&gt;
&lt;br /&gt;
    myDeque.pop_front();               // Entfernt das Element am Anfang&lt;br /&gt;
    cout &amp;lt;&amp;lt; toString(myDeque) &amp;lt;&amp;lt; endl; // Ausgabe: (Kreuz Bube, Herz Dame, Karo Ass)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für die Ausgabe des Deque wird folgende [[Methode (Programmierung)|Methode]] verwendet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Diese Methode gibt das Deque in der Form (A, B, C, ...) als Text zurück.&lt;br /&gt;
string toString(deque&amp;lt;string&amp;gt; &amp;amp; aDeque)&lt;br /&gt;
{&lt;br /&gt;
    if (aDeque.empty())&lt;br /&gt;
        return &amp;quot;()&amp;quot;;&lt;br /&gt;
    string text = &amp;quot;(&amp;quot;;&lt;br /&gt;
    for (size_t i = 0; i &amp;lt; aDeque.size() - 1; i++)&lt;br /&gt;
        text += aDeque.at(i) + &amp;quot;, &amp;quot;;&lt;br /&gt;
    text += aDeque.at(aDeque.size() - 1) + &amp;quot;)&amp;quot;;&lt;br /&gt;
    return text;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Für die Programmierung von [[Kartenspiel|Kartenspielen]] und [[Gesellschaftsspiel|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|Stapelspeicher - Beispiel mit Spielkarten]]).&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Warteschlange (Datenstruktur)]]&lt;br /&gt;
* [[Stapelspeicher]]&lt;br /&gt;
* [[Doppelt verkettete Liste]]&lt;br /&gt;
* [[Heap (Datenstruktur)]]&lt;br /&gt;
*[[Iterator]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
www.geeksforgeeks.org: [https://www.geeksforgeeks.org/implementation-deque-using-doubly-linked-list/ Implementation of Deque using doubly linked list]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenstruktur]]&lt;/div&gt;</summary>
		<author><name>2003:C3:6711:DD00:1531:7A53:A5B9:F798</name></author>
	</entry>
</feed>