Stapel (Stacks)
Zu prüfen, ob die Klammern in {[()()]} richtig zusammenpassen, braucht einen Stapel und 8 Push- und Pop-Vorgänge, einen für jede Klammer.
Last in, first out
Denk an einen Tellerstapel. Einen sauberen Teller legst du oben drauf, und wenn du einen brauchst, nimmst du ihn von oben. Der zuletzt hinzugefügte Teller kommt als Erster heraus. Ein Stapel (Stack, Kellerspeicher) ist eine Datenstruktur mit genau dieser Regel, genannt last in, first out (LIFO). Er bietet zwei Hauptoperationen: push legt einen Wert oben drauf, und pop entfernt den obersten Wert und gibt ihn zurück. Viele Stapel bieten außerdem peek, das sich den obersten Wert ansieht, ohne ihn zu entfernen.
In den Unterlagen von MIT 6.006 ist der Stapel ein Spezialfall der Sequenz-Schnittstelle: insert last(x) und delete last(). Das verrät schon, wie man einen baut. Leg die Werte in ein dynamisches Array und behandle das Ende des Arrays als Spitze. In der letzten Einheit war das Ende das billige Ende, also kosten push und pop je 1 Schritt (amortisiert, wegen der gelegentlichen Kopie). Die Größe des Stapels spielt keine Rolle. Ein Pop von einem Stapel mit 3 Werten oder mit 3 Millionen Werten ist derselbe einzelne Schritt.
const stack = [];
stack.push(4);
stack.push(8);
stack.push(5);
console.log(stack.pop()); // 5, der zuletzt hineingelegte
console.log(stack[stack.length - 1]); // peek: 8
console.log(stack.length); // 2Zum Drehen ziehen. Zum Zoomen scrollen oder mit zwei Fingern ziehen.
Klammern prüfen
Eine klassische Anwendung für einen Stapel ist die Prüfung, ob Klammern ausgeglichen sind, und genau das tut jeder Code-Editor und jeder Compiler. Lies den Text von links nach rechts. Jede öffnende Klammer, (, [ oder {, kommt per push auf den Stapel. Jede schließende Klammer muss zur öffnenden oben auf dem Stapel passen: Wenn ja, wird diese per pop entfernt. Ist der Stapel leer oder liegt oben eine andere Sorte, ist die Folge nicht ausgeglichen. Am Ende muss der Stapel leer sein, sonst wurde eine Klammer nie geschlossen.
Probier die Folgen im Labor. {[()()]} braucht 4 Pushs und 4 Pops, 8 Schritte, und endet mit einem leeren Stapel. ([)] scheitert am dritten Zeichen: Die ) kommt, während [ oben liegt. (() wird bis zum Ende gelesen, und eine ( bleibt übrig. Warum passt ein Stapel zu dieser Aufgabe? Klammern sind verschachtelt, und die zuletzt geöffnete muss als Erste geschlossen werden. Das ist last in, first out.
Wo Stapel sonst vorkommen
- Der Aufrufstapel. Wenn Funktion a die Funktion b aufruft und b die Funktion c, legt der Computer für jeden Aufruf einen Eintrag ab. Wenn c zurückkehrt, wird sein Eintrag entfernt, und b macht dort weiter, wo es aufgehört hat. Endlose Rekursion füllt diesen Stapel, das ist der Fehler „Stack Overflow“.
- Rückgängig. Ein Editor legt jede Änderung auf einen Stapel. „Rückgängig“ nimmt die letzte Änderung herunter und macht sie rückgängig.
- Zurück-Taste. Ein Browser legt jede Seite ab, die du verlässt; „Zurück“ nimmt die letzte herunter.
- Tiefensuche. Der Algorithmenkurs hat einen Stapel benutzt, um in einem Labyrinth so tief wie möglich zu gehen, bevor er umkehrt.
- In welcher Reihenfolge gibt ein Stapel Werte zurück?
- First in, first out
- Last in, first out
- Das Kleinste zuerst
- Zufällige Reihenfolge
- Beginn leer. Push 4, push 8, push 5, pop, push 2. Was liegt oben?
- 4
- 8
- 5
- 2
- Wie viele Werte liegen nach diesen Operationen auf dem Stapel?
- Push A, dann B, dann C, dann Pop, bis der Stapel leer ist. Bring die entnommenen Werte in die richtige Reihenfolge.
- Wie viele Push- und Pop-Vorgänge braucht die Prüfung von {[()()]} mit dem Klammerverfahren insgesamt?
- Wo scheitert die Prüfung von ([)] von links aus?
- An der ersten (
- An [
- An )
- An der letzten ]
- Was stimmt an (() nicht?
- Eine schließende Klammer trifft auf einen leeren Stapel
- Am Ende liegt noch eine ( auf dem Stapel
- Eckige Klammern fehlen
- Nichts; es ist ausgeglichen
- Wie viele Schritte kostet ein Pop von einem Stapel (gespeichert in einem dynamischen Array) mit 1000 Werten?
- Die Funktion main ruft draw auf, und draw ruft line auf. Welcher Eintrag liegt oben auf dem Aufrufstapel, während line läuft?
- main
- draw
- line
- keiner
- In welchem Jahr meldeten Bauer und Samelson ihr Patent auf das Stapelverfahren an?
- 1946
- 1957
- 1962
- 1972
- Ein Stapel ist last in, first out: push legt oben drauf, pop nimmt von oben.
- Auf dem Ende eines dynamischen Arrays gebaut, kosten push und pop je 1 Schritt.
- Die Klammerprüfung legt öffnende Klammern ab und nimmt bei jeder schließenden eine herunter; {[()()]} braucht 8 Schritte.
- Der Aufrufstapel, „Rückgängig“ und die Zurück-Taste sind Stapel.
Quellen zu diesem Kurs (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 2 Data Structures (interface vs data structure, Sequence and Set interfaces, stack = insert_last/delete_last, queue = insert_last/delete_first, array, linked list, dynamic array, amortized Θ(1) append)
- 4 Hashing (chaining, pigeonhole collisions, chain length n/m)
- 6 Binary Trees Part 1 (height, traversal order, O(h) operations) and 7 Binary Trees Part 2: AVL (Adelson-Velsky and Landis, 1962) at ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes
- MDN Web Docs, Array.prototype.shift (shifts all values left by 1)
- Array.prototype.unshift, Map (insertion order, Map vs Object, spec requires sublinear average access) and Set (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)
- ECMAScript 2025 Language Specification (tc39.es/ecma262)
- 24.1 Map Objects and 24.2 Set Objects ("must be implemented using either hash tables or other mechanisms that, on average, provide access times that are sublinear on the number of elements")
- Array.prototype.shift steps (Repeat, while k < len: move element k to k - 1)
- D. E. Knuth, The Art of Computer Programming vol. 3 (2nd ed. 1998) section 6.4 History (H. P. Luhn, IBM internal memorandum January 1953, hashing with chaining; digit pairs added mod 10, 31415926 -> 4548) via gwern.net copy, and IEEE Spectrum, "Hans Peter Luhn and the Birth of the Hashing Algorithm" (2018)
- "A brief history of the stack", SIGCIS (sigcis.org/files/A brief history.pdf: Bauer and Samelson applied for the patent in 1957, US 3,047,228 granted July 31, 1962; IPL list processing by Newell, Simon and Shaw at RAND 1956) and Wikipedia, Information Processing Language (Newell, Shaw, Simon, RAND and Carnegie Institute of Technology, about 1956).
Abgerufen: 2026-10-18