{"id":30799,"date":"2022-06-07T22:09:40","date_gmt":"2022-06-07T20:09:40","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=30799"},"modified":"2024-11-27T15:06:25","modified_gmt":"2024-11-27T14:06:25","slug":"deque-implementieren-array","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/deque-implementieren-array\/","title":{"rendered":"Deque mit einem Array implementieren"},"content":{"rendered":"\n<p>In diesem Teil der Tutorialserie zeige ich dir, wie man eine Deque mit einem Array implementiert \u2013 genauer gesagt: mit einem Ringbuffer (englisch: \"circular array\").<\/p>\n\n\n\n<p>Wir beginnen mit einem <em>bounded<\/em> Deque, also einem mit festgelegter Kapazit\u00e4t, und erweitern dieses dann zu einem <em>unbounded<\/em> Deque, also einem, das unbegrenzt viele Elemente aufnehmen kann.<\/p>\n\n\n\n<p>Falls du den Artikel \"<a href=\"\/de\/algorithmen\/queue-implementieren-array\/\">Queue mit einem Array implementieren<\/a>\" gelesen hast, wird dir vieles bekannt vorkommen. Denn die Deque-Implementierung ist im Grunde eine Erweiterung der Queue-Implementierung.<\/p>\n\n\n\n<p>Beginnen wir mit dem <em>bounded<\/em> Deque...<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"implementierung-eines-bounded-deque-mit-einem-array\">Implementierung eines bounded Deque mit einem Array<\/h2>\n\n\n\n<p>Wir beginnen mit einem leeren Array sowie zwei Variablen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>headIndex<\/code> \u2013 zeigt auf den Kopf des Deques, also das Element, das vom Kopf des Deques als n\u00e4chstes entnommen werden w\u00fcrde<\/li><li><code>tailIndex<\/code> \u2013 zeigt auf ein Feld rechts neben dem Ende des Deques, also das Feld, das am Ende des Deques als n\u00e4chstes gef\u00fcllt werden w\u00fcrde<\/li><li><code>numberOfElements<\/code> \u2013 die Anzahl der Elemente im Deque<\/li><\/ul>\n\n\n\n<p>Wir lassen die Index-Variablen zun\u00e4chst auf die Mitte des Arrays zeigen, so dass wir ausreichend Platz haben, um sowohl am Kopf als auch am Ende des Deques Elemente hinzuzuf\u00fcgen:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-800x194.png\" alt=\"Deque mit einem Array implementieren: leeres Deque\" class=\"wp-image-30805\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-empty.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit einem Array implementieren: leeres Deque<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"funktionsweise-der-enqueue-operationen\">Funktionsweise der Enqueue-Operationen<\/h3>\n\n\n\n<p>Um ein Element am Ende des Deques hinzuzuf\u00fcgen, speichern wir es in demjenigen Arrayfeld, auf das <code>tailIndex<\/code> zeigt; danach erh\u00f6hen wir <code>tailIndex<\/code> um 1.<\/p>\n\n\n\n<p>Die folgende Grafik zeigt das Deque, nachdem wir die Elemente \"banana\" und \"cherry\" am Ende des Deques eingef\u00fcgt haben:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-800x194.png\" alt=\"Deque mit einem Array implementieren: zwei Elemente am Ende hinzugef\u00fcgt\" class=\"wp-image-30808\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-back.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit einem Array implementieren: zwei Elemente am Ende hinzugef\u00fcgt<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Um ein Element am Kopf des Deques einzuf\u00fcgen, verringern wir <code>headIndex<\/code> um 1 und speichern das Element dann in demjenigen Arrayfeld, auf das <code>headIndex<\/code> zeigt.<\/p>\n\n\n\n<p>In der folgenden Grafik siehst du, wie die Elemente \"grape\", \"lemon\" und \"coconut\" (in dieser Reihenfolge) am Kopf des Deques eingef\u00fcgt wurden:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-800x194.png\" alt=\"Deque mit einem Array implementieren: zwei Elemente am Kopf hinzugef\u00fcgt\" class=\"wp-image-30813\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-enqueue-at-front.v2.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit einem Array implementieren: zwei Elemente am Kopf hinzugef\u00fcgt<\/figcaption><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"funktionsweise-der-dequeue-operationen\">Funktionsweise der Dequeue-Operationen<\/h3>\n\n\n\n<p>Um Elemente zu entnehmen gehen wir genau andersherum vor.<\/p>\n\n\n\n<p>Um ein Element vom Ende des Deques zu entnehmen, verringern wir <code>tailIndex<\/code> um 1, lesen das Array an Position <code>tailIndex<\/code> aus und setzen dieses Feld dann auf <code>null<\/code>.<\/p>\n\n\n\n<p>Die folgende Grafik zeigt das Deque, nachdem wir drei Elemente am Ende (\"cherry\", \"banana\", \"grape\") entnommen haben:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-800x194.png\" alt=\"Deque mit einem Array implementieren: drei Elemente am Ende entnommen\" class=\"wp-image-30814\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-back.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit einem Array implementieren: drei Elemente am Ende entnommen<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Um ein Element am Kopf des Deques zu entnehmen, lesen wir das Array an Position <code>headIndex<\/code> aus, setzen das Feld auf <code>null<\/code> und erh\u00f6hen <code>headIndex<\/code> um 1.<\/p>\n\n\n\n<p>Die folgende Grafik zeigt das Deque, nachdem wir ein Element vom Kopf des Deques (\"coconut\") entnommen haben:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-800x194.png\" alt=\"Deque mit einem Array implementieren: ein Element am Kopf entnommen\" class=\"wp-image-30815\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-dequeue-at-front.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit einem Array implementieren: ein Element am Kopf entnommen<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Damit haben wir die Funktionsweise der vier Grundfunktionen des Deques \u2013 <em>Enqueue at front<\/em>, <em>Enqueue at back<\/em>, <em>Deque at front<\/em> und <em>Deque at back<\/em> \u2013 behandelt.<\/p>\n\n\n\n<p>Allerdings k\u00f6nnten wir (ohne zus\u00e4tzliche Logik) am Kopf des Deques nur noch zwei Elemente hinzuf\u00fcgen, obwohl erst eines von acht Feldern belegt ist. Ebenso k\u00f6nnten wir am Ende des Deques maximal f\u00fcnf Elemente anh\u00e4ngen.<\/p>\n\n\n\n<p>Um das Deque bis zur Kapazit\u00e4tsgrenze auff\u00fcllen zu k\u00f6nnen (egal in welcher Richtung), m\u00fcssen wir aus dem Array einen Ringbuffer (englisch: \"circular array\") machen.<\/p>\n\n\n\n<p>Wie das funktioniert, erf\u00e4hrst du im n\u00e4chsten Abschnitt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ringbuffer\">Ringbuffer<\/h3>\n\n\n\n<p>Um zu zeigen, wie ein Ringbuffer funktioniert, habe ich das Array aus dem vorherigen Beispiel kreisf\u00f6rmig dargestellt:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-half_400\"><img decoding=\"async\" width=\"400\" height=\"343\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-400x343.png\" alt=\"Deque implementiert mit einem Ringpuffer (&quot;circular array&quot;) - 1 Element\" class=\"wp-image-30824\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-400x343.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-224x192.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-336x288.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-504x432.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-672x576.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element-600x515.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-1-element.png 800w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/figure>\n<\/div>\n\n\n<p>Um Elemente am Kopf des Deques einzuf\u00fcgen, schreiben wir diese entgegen dem Uhrzeigersinn in das Array. Das folgende Beispiel zeigt, die die Elemente \"mango\", \"fig\", \"pomelo\" und \"apricot\" an die Positionen 1, 0, 7 und 6 eingef\u00fcgt wurden:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-half_400\"><img decoding=\"async\" width=\"400\" height=\"344\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-400x344.png\" alt=\"Deque implementiert mit einem Ringpuffer (&quot;circular array&quot;) - 5 Elemente\" class=\"wp-image-30825\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-400x344.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-224x193.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-336x289.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-504x433.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-672x578.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements-600x516.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-5-elements.png 800w\" sizes=\"(max-width: 400px) 100vw, 400px\" \/><\/figure>\n<\/div>\n\n\n<p>Wenn wir das Array wieder \"flach\" darstellen, sieht es wie folgt aus. Der \u00dcbersicht halber habe ich am Kopf des Deques einen Pfeil hinzugef\u00fcgt.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"194\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-800x194.png\" alt=\"Deque mit &quot;flacher&quot; Darstellung des Ringpuffers\" class=\"wp-image-30828\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-800x194.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-224x54.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-336x81.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-504x122.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-672x163.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-400x97.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-600x146.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-944x229.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat-1200x291.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-flat.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Deque mit \"flacher\" Darstellung des Ringpuffers<\/figcaption><\/figure>\n<\/div>\n\n\n<p>In beiden Darstellungen ist gut erkennbar, dass vor dem Element \"fig\" an Index 0 das Element \"pomelo\" an Index 7 steht.<\/p>\n\n\n\n<p>Analog dazu f\u00fcgen wir Elemente am Ende des Deques ein und entnehmen Elemente. Zusammengefasst gehen wir bei den Operationen wie folgt vor:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Enqueue at back: erh\u00f6he <code>tailIndex<\/code> um 1; wenn <code>tailIndex<\/code> 8 erreicht, setze es auf 0.<\/li><li>Enqueue at front: vermindere <code>headIndex<\/code> um 1; wenn <code>headIndex<\/code> -1 erreicht, setze es auf 7.<\/li><li>Deque at back: vermindere <code>tailIndex<\/code> um 1; wenn <code>tailIndex<\/code> -1 erreicht, setze es auf 7.<\/li><li>Deque at front: erh\u00f6he <code>headIndex<\/code> um 1; wenn <code>headIndex<\/code> 8 erreicht, setze es auf 0.<\/li><\/ul>\n\n\n\n<p>Die Indexe 8 und 7 gelten f\u00fcr das Beispiel oben. Allgemein verwenden wir <code>elements.length<\/code> statt 8 und <code>element.length - 1<\/code> statt 7. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"volles-deque-vs-leeres-deque\">Volles Deque vs. leeres Deque<\/h3>\n\n\n\n<p>Sowohl bei einem vollen als auch bei einem leeren Deque zeigen <code>tailIndex<\/code> und <code>headIndex<\/code> auf dasselbe Arrayfeld. Um zu erkennen, ob das Deque voll oder leer ist, speichern wir zus\u00e4tzlich die Anzahl der Elemente in <code>numberOfElements<\/code>.<\/p>\n\n\n\n<p>Es gibt noch andere M\u00f6glichkeiten, um ein volles von einem leeren Deque zu unterscheiden:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Wir speichern die Anzahl der Elemente \u2013 und den <code>tailIndex<\/code> <em>oder<\/em> den <code>headIndex<\/code>. Den jeweils anderen Index k\u00f6nnen wir dann durch Addition oder Subtraktion der Anzahl der Elemente berechnen. Diese Variante f\u00fchrt zu komplexerem und schlechter lesbaren Code.<\/li><li>Wir speichern die Anzahl der Elemente <em>nicht<\/em> und erkennen ein leeres Deque daran, dass \u2013 wenn <code>tailIndex<\/code> und <code>headIndex<\/code> identisch sind \u2013 das Array an dieser Position leer ist.<\/li><li>Wir f\u00fcllen das Deque nicht komplett, sondern lassen mindestens ein Feld frei. Wir verschwenden dabei zwar ein Feld des Arrays, sparen uns daf\u00fcr aber den Speicherplatz f\u00fcr die <code>numberOfElements<\/code>-Variable.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"quellcode-fuer-das-bounded-deque-mit-einem-array\">Quellcode f\u00fcr das bounded Deque mit einem Array<\/h2>\n\n\n\n<p>Die Implementierung des oben beschriebenen Algorithmus ist nicht kompliziert, wie du im folgenden Beispiel-Code sehen wirst. Du findest den Code in der Klasse <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/collections\/deque\/BoundedArrayDeque.java\" target=\"_blank\">BoundedArrayDeque<\/a> im GitHub-Repository.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BoundedArrayDeque<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt; <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Deque<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt; <\/span>{\n\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Object&#091;] elements;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> headIndex;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> tailIndex;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> numberOfElements;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">BoundedArrayDeque<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> capacity)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (capacity &lt; <span class=\"hljs-number\">1<\/span>) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException(<span class=\"hljs-string\">\"Capacity must be 1 or higher\"<\/span>);\n    }\n\n    elements = <span class=\"hljs-keyword\">new<\/span> Object&#091;capacity];\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueFront<\/span><span class=\"hljs-params\">(E element)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (numberOfElements == elements.length) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalStateException(<span class=\"hljs-string\">\"The deque is full\"<\/span>);\n    }\n    headIndex = decreaseIndex(headIndex);\n    elements&#091;headIndex] = element;\n    numberOfElements++;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueBack<\/span><span class=\"hljs-params\">(E element)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (numberOfElements == elements.length) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalStateException(<span class=\"hljs-string\">\"The deque is full\"<\/span>);\n    }\n    elements&#091;tailIndex] = element;\n    tailIndex = increaseIndex(tailIndex);\n    numberOfElements++;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> E <span class=\"hljs-title\">dequeueFront<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    E element = elementAtHead();\n    elements&#091;headIndex] = <span class=\"hljs-keyword\">null<\/span>;\n    headIndex = increaseIndex(headIndex);\n    numberOfElements--;\n    <span class=\"hljs-keyword\">return<\/span> element;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> E <span class=\"hljs-title\">dequeueBack<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    E element = elementAtTail();\n    tailIndex = decreaseIndex(tailIndex);\n    elements&#091;tailIndex] = <span class=\"hljs-keyword\">null<\/span>;\n    numberOfElements--;\n    <span class=\"hljs-keyword\">return<\/span> element;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> E <span class=\"hljs-title\">peekFront<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> elementAtHead();\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> E <span class=\"hljs-title\">peekBack<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> elementAtTail();\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> E <span class=\"hljs-title\">elementAtHead<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (isEmpty()) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> NoSuchElementException();\n    }\n\n    <span class=\"hljs-meta\">@SuppressWarnings<\/span>(<span class=\"hljs-string\">\"unchecked\"<\/span>)\n    E element = (E) elements&#091;headIndex];\n\n    <span class=\"hljs-keyword\">return<\/span> element;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> E <span class=\"hljs-title\">elementAtTail<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (isEmpty()) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> NoSuchElementException();\n    }\n\n    <span class=\"hljs-meta\">@SuppressWarnings<\/span>(<span class=\"hljs-string\">\"unchecked\"<\/span>)\n    E element = (E) elements&#091;decreaseIndex(tailIndex)];\n\n    <span class=\"hljs-keyword\">return<\/span> element;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">decreaseIndex<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{\n    index--;\n    <span class=\"hljs-keyword\">if<\/span> (index &lt; <span class=\"hljs-number\">0<\/span>) {\n      index = elements.length - <span class=\"hljs-number\">1<\/span>;\n    }\n    <span class=\"hljs-keyword\">return<\/span> index;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">increaseIndex<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> index)<\/span> <\/span>{\n    index++;\n    <span class=\"hljs-keyword\">if<\/span> (index == elements.length) {\n      index = <span class=\"hljs-number\">0<\/span>;\n    }\n    <span class=\"hljs-keyword\">return<\/span> index;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">isEmpty<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> numberOfElements == <span class=\"hljs-number\">0<\/span>;\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Bitte beachte, dass <code>BoundedArrayDeque<\/code> <em>nicht<\/em> das <code>Deque<\/code>-Interface des JDK implementiert, sondern ein eigenes, das nur die Methoden <code>enqueueFront()<\/code>, <code>enqueueBack()<\/code>, <code>dequeueFront()<\/code>, <code>dequeueBack()<\/code>, <code>peekFront()<\/code>, <code>peekBack()<\/code> und <code>isEmpty()<\/code> definiert (s. <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/collections\/deque\/Deque.java\" target=\"_blank\" rel=\"noopener\">Deque-Interface<\/a> im GitHub-Repository):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">Deque<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt; <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueFront<\/span><span class=\"hljs-params\">(E element)<\/span><\/span>;\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueBack<\/span><span class=\"hljs-params\">(E element)<\/span><\/span>;\n  <span class=\"hljs-function\">E <span class=\"hljs-title\">dequeueFront<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n  <span class=\"hljs-function\">E <span class=\"hljs-title\">dequeueBack<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n  <span class=\"hljs-function\">E <span class=\"hljs-title\">peekFront<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n  <span class=\"hljs-function\">E <span class=\"hljs-title\">peekBack<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span> <span class=\"hljs-title\">isEmpty<\/span><span class=\"hljs-params\">()<\/span><\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wie du <code>BoundedArrayDeque<\/code> benutzen kannst, siehst du im Demo-Programm <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/deque\/DequeDemo.java\" target=\"_blank\">DequeDemo<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"implementierung-eines-unbounded-deque-mit-einem-array\">Implementierung eines unbounded Deque mit einem Array<\/h2>\n\n\n\n<p>Wenn unser Deque nicht gr\u00f6\u00dfenbeschr\u00e4nkt, also unbounded sein soll, wird es etwas komplizierter. Denn dazu m\u00fcssen wir das Array wachsen lassen. Da das nicht direkt m\u00f6glich ist, m\u00fcssen wir ein neues, gr\u00f6\u00dferes Array erstellen und die bestehenden Elemente dorthin kopieren.<\/p>\n\n\n\n<p>Dabei m\u00fcssen wir den Ringbuffer-Charakter des Arrays ber\u00fccksichtigen. D. h. wir k\u00f6nnen die Elemente nicht einfach an den Anfang des neuen Arrays kopieren. <\/p>\n\n\n\n<p>Die folgende Grafik (ich habe das Deque aus dem vorherigen Beispiel noch um die Elemente \"papaya\" am Ende sowie \"melon\" und \"kiwi\" am Kopf erweitert) zeigt, was dabei passieren w\u00fcrde:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"209\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-800x209.png\" alt=\"Erweitern eines Deques: Umkopieren in ein neues Array \u2013 so nicht!\" class=\"wp-image-30844\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-800x209.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-224x59.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-336x88.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-504x132.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-672x176.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-400x105.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-600x157.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-944x247.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly-1200x314.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-wrongly.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Umkopieren in ein neues Array \u2013 so nicht!<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Die leeren Felder liegen zwar am Ende <em>des Arrays<\/em>, aber in der Mitte der Elemente <em>des Deques<\/em>. <\/p>\n\n\n\n<p>Daher m\u00fcssen wir beim Kopieren in das neue Array entweder die rechten Elemente (also den linken Teil des Deques) an den rechten Rand des neuen Arrays kopieren. Oder wir kopieren die rechten Elemente an den Anfang des neuen Arrays und die linken Elemente (den rechten Teil des Deques) dahinter. <\/p>\n\n\n\n<p>Die folgende Grafik zeigt die zweite Strategie, die im Code einfacher zu implementieren ist:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"208\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-800x208.png\" alt=\"Erweitern eines Deques: Umkopieren in ein neues Array mit Neuanordnung\" class=\"wp-image-30845\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-800x208.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-224x58.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-336x87.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-504x131.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-672x175.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-400x104.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-600x156.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-944x245.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly-1200x312.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/implement-deque-using-circular-array-growing-correctly.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>Umkopieren in ein neues Array mit Neuanordnung<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Somit liegen die leeren Felder vor dem ersten Element (\"kiwi\") bzw. hinter dem letzten Element (\"papaya\") des Deques, und wir k\u00f6nnen auf beiden Seiten das Deques neue Elemente einf\u00fcgen. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"quellcode-fuer-ein-unbounded-deque-mit-einem-array\">Quellcode f\u00fcr ein unbounded Deque mit einem Array<\/h2>\n\n\n\n<p>Im folgenden findest du den Code f\u00fcr ein circular-array-basiertes, unbounded Deque.<\/p>\n\n\n\n<p>Die Klasse hat zwei Konstruktoren: einen, bei dem man die Startkapazit\u00e4t des Deques als Parameter \u00fcbergeben kann und einen Default-Konstruktor, der die Startkapazit\u00e4t auf zehn Elemente setzt.<\/p>\n\n\n\n<p>Die Methoden <code>enqueueFront()<\/code> und <code>enqueueBack()<\/code> pr\u00fcfen, ob die Kapazit\u00e4t des Deques erreicht ist. Wenn ja, rufen sie die Methode <code>grow()<\/code> auf. Diese wiederum ruft <code>calculateNewCapacity()<\/code> auf, um die neue Kapazit\u00e4t zu berechnen, und dann <code>growToNewCapacity()<\/code>, um die Elemente \u2013 wie oben gezeigt \u2013 in ein neues, gr\u00f6\u00dferes Array zu kopieren.<\/p>\n\n\n\n<p>Du findest den Code in der Klasse <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/collections\/deque\/ArrayDeque.java\" target=\"_blank\">ArrayDeque<\/a> im GitHub-Repository.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ArrayDeque<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt; <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Deque<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt; <\/span>{\n\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">int<\/span> DEFAULT_INITIAL_CAPACITY = <span class=\"hljs-number\">10<\/span>;\n\n  <span class=\"hljs-keyword\">private<\/span> Object&#091;] elements;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> headIndex;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> tailIndex;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">int<\/span> numberOfElements;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">ArrayDeque<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>(DEFAULT_INITIAL_CAPACITY);\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">ArrayDeque<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> capacity)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (capacity &lt; <span class=\"hljs-number\">1<\/span>) {\n      <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> IllegalArgumentException(<span class=\"hljs-string\">\"Capacity must be 1 or higher\"<\/span>);\n    }\n\n    elements = <span class=\"hljs-keyword\">new<\/span> Object&#091;capacity];\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueFront<\/span><span class=\"hljs-params\">(E element)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (numberOfElements == elements.length) {\n      grow();\n    }\n    headIndex = decreaseIndex(headIndex);\n    elements&#091;headIndex] = element;\n    numberOfElements++;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueueBack<\/span><span class=\"hljs-params\">(E element)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (numberOfElements == elements.length) {\n      grow();\n    }\n    elements&#091;tailIndex] = element;\n    tailIndex = increaseIndex(tailIndex);\n    numberOfElements++;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">grow<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">int<\/span> newCapacity = calculateNewCapacity(elements.length);\n    growToNewCapacity(newCapacity);\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">calculateNewCapacity<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> currentCapacity)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> currentCapacity + currentCapacity \/ <span class=\"hljs-number\">2<\/span>;\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">growToNewCapacity<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">int<\/span> newCapacity)<\/span> <\/span>{\n    Object&#091;] newArray = <span class=\"hljs-keyword\">new<\/span> Object&#091;newCapacity];\n\n    <span class=\"hljs-comment\">\/\/ Copy to the beginning of the new array: from tailIndex to end of old array<\/span>\n    <span class=\"hljs-keyword\">int<\/span> oldArrayLength = elements.length;\n    <span class=\"hljs-keyword\">int<\/span> numberOfElementsAfterTail = oldArrayLength - tailIndex;\n    System.arraycopy(elements, tailIndex, newArray, <span class=\"hljs-number\">0<\/span>, numberOfElementsAfterTail);\n\n    <span class=\"hljs-comment\">\/\/ Append to the new array: from beginning to tailIndex of old array<\/span>\n    <span class=\"hljs-keyword\">if<\/span> (tailIndex &gt; <span class=\"hljs-number\">0<\/span>) {\n      System.arraycopy(elements, <span class=\"hljs-number\">0<\/span>, newArray, numberOfElementsAfterTail, tailIndex);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Adjust head and tail<\/span>\n    headIndex = <span class=\"hljs-number\">0<\/span>;\n    tailIndex = oldArrayLength;\n    elements = newArray;\n  }\n\n  <span class=\"hljs-comment\">\/\/ The remaining methods are the same as in BoundedArrayDeque:<\/span>\n  <span class=\"hljs-comment\">\/\/ - dequeFront(), dequeBack(), <\/span>\n  <span class=\"hljs-comment\">\/\/ - peekFront(), peekBack(), <\/span>\n  <span class=\"hljs-comment\">\/\/ - elementAtHead(), elementAtTail(), <\/span>\n  <span class=\"hljs-comment\">\/\/ - decreaseIndex(), increaseIndex(), isEmpty()<\/span>\n\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die in den Kommentaren am Ende des Quellcodes aufgelisteten Methoden gleichen denen des im vorletzten Abschnitt dargestellten <code>BoundedArrayDeque<\/code>. Daher habe ich hier auf einen erneuten Abdruck verzichtet.<\/p>\n\n\n\n<p>Die <code>calculateNewCapacity()<\/code>-Methode habe ich hier im Vergleich zum <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/collections\/deque\/ArrayDeque.java#L68\">Code auf GitHub<\/a> stark vereinfacht dargestellt. Die Methode im Repository verdoppelt die Arraygr\u00f6\u00dfe solange es k\u00fcrzer als 64 Elemente ist; danach vergr\u00f6\u00dfert sie es nur noch um Faktor 1,5. Au\u00dferdem pr\u00fcft die Methode, ob eine Maximalgr\u00f6\u00dfe f\u00fcr Arrays erreicht ist.<\/p>\n\n\n\n<p>Unser <code>ArrayDeque<\/code> w\u00e4chst jetzt, sobald seine Kapazit\u00e4t f\u00fcr ein neues Element nicht mehr ausreicht.<\/p>\n\n\n\n<p>Was es nicht kann, ist wieder zu schrumpfen, wenn sehr viele Elemente wieder entnommen wurden und ein Gro\u00dfteil der Arrayfelder nicht mehr ben\u00f6tigt wird. Gerne \u00fcberlasse ich dir eine solche Erweiterung als \u00dcbungsaufgabe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p>Im heutigen Teil der Tutorialserie hast du ein Deque mit einem Array implementiert (genauer gesagt: mit einem Ringbuffer). Schau dir gerne auch einmal den Artikel \"<a href=\"\/de\/algorithmen\/queue-implementieren-array\/\">Queue mit einem Array implementieren<\/a>\" an \u2013 dort findest du eine \u00e4hnliche Implementierung f\u00fcr eine Queue.<\/p>\n\n\n\n<p>In den zwei kommenden Teilen der Deque-Serie werde ich noch einmal die <a href=\"\/de\/algorithmen\/java-deque-vs-stack\/\">Unterschiede zwischen einem Deque und einem Stack<\/a> bzw. <a href=\"\/de\/algorithmen\/java-queue-vs-deque\/\">zwischen einem Deque und einer Queue<\/a> zusammenfassen.<\/p>\n\n\n\n<p>Wenn du noch Fragen hast, stelle sie gerne \u00fcber die Kommentar-Funktion. M\u00f6chtest du \u00fcber neue Tutorials und Artikel informiert werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie implementiert man in Java eine Queue basierend auf einem Array (ohne Java-Collections-Klassen)? Wie w\u00e4chst das Array bei Bedarf?<\/p>\n","protected":false},"author":1,"featured_media":30802,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie implementiert man in Java ein Deque basierend auf einem Array (ohne Java-Collections-Klassen)? Wie w\u00e4chst das Array bei Bedarf?","_seopress_robots_index":"","_uag_custom_page_level_css":"","_metis_text_type":"standard","_metis_text_length":14064,"_post_count":0,"footnotes":""},"categories":[127],"tags":[195],"class_list":["post-30799","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-deque"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/spark-1948011-1770x986-1.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Wie implementiert man in Java eine Queue basierend auf einem Array (ohne Java-Collections-Klassen)? Wie w\u00e4chst das Array bei Bedarf?","public_identification_id":"12bcedcbae6444a5a306521c572fc691","private_identification_id":"2c9530afbb9a4b0187a1577bf33f3568","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30799","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=30799"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30799\/revisions"}],"predecessor-version":[{"id":31199,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30799\/revisions\/31199"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/30802"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=30799"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=30799"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=30799"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}