Menu
Coddy logo textTech

Stack (Stapel)

Zuletzt aktualisiert

Ein Stack ist eine Sammlung mit genau einem offenen Ende. Du legst einen Wert oben drauf (push) und nimmst ihn oben wieder herunter (pop), sodass der zuletzt abgelegte Wert immer als erster wieder herauskommt. Genau das bedeutet LIFO, last in, first out, und das ist die ganze Regel: An die Mitte kommst du nicht heran, ohne vorher alles zu entfernen, was darüber liegt. Drücke oben auf Abspielen und sieh zu, wie die Säule mit jedem push wächst und mit jedem pop am selben Ende wieder schrumpft.

Die Einschränkung ist der Punkt. Weil beide Operationen nur das obere Ende berühren, kostet jede von ihnen O(1), egal wie hoch der Stack wird, und diese Vorhersagbarkeit ist der Grund, warum Stacks unter so vielem in der Informatik stecken: der Aufrufstapel (Call Stack), auf dem Rekursion läuft, die Undo-Historie in einem Editor, die Klammernprüfung in einem Parser und der explizite Stack, der eine rekursive Tiefensuche in eine Schleife verwandelt. Vertausche das Ende, an dem entfernt wird, und du hast stattdessen eine Queue.

Zeit- und Speicherkomplexität

Für den üblichen Stack auf Basis eines Arrays oder einer verketteten Liste:

OperationKomplexitätHinweise
Push (ablegen)O(1)Auf einem dynamischen Array amortisiert O(1), weil es gelegentlich seine Größe ändert.
Pop (entnehmen)O(1)Immer das oberste Element, es muss also nichts verschoben werden.
Peek (oben ansehen)O(1)Den obersten Wert lesen, ohne ihn zu entfernen.
SuchenO(n)Dafür ist ein Stack nicht gedacht: Du musst dich Wert für Wert nach unten arbeiten.
SpeicherO(n)Ein Platz pro gespeichertem Wert.

Schritt für Schritt

SchrittWas passiert
1Der Stack startet leer, das obere Ende zeigt auf nichts.
2Push schreibt den Wert an die oberste Position und schiebt das obere Ende um eins nach oben.
3Jedes weitere Push landet direkt über dem vorherigen Wert.
4Pop liest den Wert am oberen Ende und schiebt das obere Ende danach um eins nach unten.
5Zurück kommt immer der Wert, der zuletzt abgelegt wurde.
6Ein Pop auf einem leeren Stack ist ein Fehler, ein Stack Underflow, deshalb prüft echter Code vorher is_empty().

Durchgerechnetes Beispiel

3, 7 und 5 ablegen und den Stack danach leeren:

OperationStack (unten nach oben)Gibt zurück
push(3)[3]nichts
push(7)[3, 7]nichts
push(5)[3, 7, 5]nichts
pop()[3, 7]5, der neueste Wert
pop()[3]7
pop()[]3, der älteste Wert, zuletzt

Wann man einen Stack verwendet

Verwenden, wennVermeiden, wenn
Du das zuletzt hinzugefügte Element zuerst zurückbrauchst: Undo, Zurück-Buttons, KlammernprüfungDu das älteste Element zuerst brauchst, dafür ist eine Queue da
Du einen rekursiven Algorithmus in einen iterativen umschreibstDu in der Mitte der Daten suchen oder indizieren musst
Du verschachtelte Strukturen parst, etwa Ausdrücke, JSON oder HTMLViele Leser beliebigen Zugriff brauchen, wofür ein Array oder eine Map besser passt
Du garantiert O(1) beim Einfügen und Entfernen willst, ohne RebalancingDu die Daten sortiert halten musst, was dir ein Heap oder ein Baum liefert

Stack-Code

Eine saubere, lauffähige Stack-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Stack-Code in Python

Python
1stack = []2
3# Push three values onto the top4for value in [3, 7, 5]:5    stack.append(value)6    print(f"push {value} -> {stack}")7
8# Pop them back off: last in, first out9while stack:10    value = stack.pop()11    print(f"pop  {value} -> {stack}")12
13print("empty:", len(stack) == 0)
Führe diesen Code im Python-Playground aus

Stack FAQ

Was bedeutet LIFO?
Last in, first out: Der zuletzt abgelegte Wert wird als erster wieder entnommen. Das übliche Bild ist ein Stapel Teller, du nimmst den Teller, den du gerade abgestellt hast, nicht den ganz unten. Eine Queue folgt der umgekehrten Regel, FIFO.
Was ist der Unterschied zwischen einem Stack und einer Queue?
Nur das Ende, an dem entfernt wird. Beide fügen an einem Ende in O(1) hinzu; ein Stack entfernt am selben Ende (LIFO), eine Queue am anderen (FIFO). Alles andere, auch die Komplexitätstabelle oben, ist identisch.
Was sind die wichtigsten Stack-Operationen?
push legt einen Wert oben ab, pop entfernt den obersten Wert und gibt ihn zurück, peek (manchmal top) liest den obersten Wert, ohne ihn zu entfernen, und is_empty meldet, ob noch etwas übrig ist. Alle vier sind O(1).
Was ist ein Stack Overflow?
Ein push auf einen Stack, der keinen Platz mehr hat. Der berühmte Fall ist der Aufrufstapel: Jeder Funktionsaufruf legt einen Frame ab, deshalb legt eine Rekursion, die ihren Basisfall nie erreicht, so lange weiter ab, bis das Stack-Limit der Laufzeitumgebung erreicht ist und das Programm abstürzt. Der spiegelbildliche Fehler, ein pop auf einem leeren Stack, heißt Stack Underflow.
Wie wird ein Stack implementiert?
Zwei übliche Wege. Ein dynamisches Array legt am Ende ab und entnimmt dort, amortisiert O(1) und cache-freundlich: So arbeiten Pythons list und Javas ArrayDeque. Eine verkettete Liste legt am Kopf ab und entnimmt dort, im Worst Case O(1) ohne Umkopieren, kostet aber einen Zeiger pro Element. C++' std::stack ist ein Adapter, der standardmäßig auf std::deque läuft, einem segmentierten Array, und bei Bedarf einen anderen Container nimmt.
Wo werden Stacks in echten Programmen eingesetzt?
Der Aufrufstapel für Funktionsaufrufe und Rekursion, die Undo- und Redo-Historie, die Zurück-Navigation im Browser, das Auswerten von Ausdrücken und die Klammernprüfung in Parsern sowie der explizite Stack, der eine rekursive Tiefensuche in eine iterative Schleife verwandelt.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S