edubun
Nederlands

Stapels

Controleren of de haakjes in {[()()]} goed gepaard zijn vraagt één stapel en 8 pushes en pops, één voor elk haakje.

Laatst erin, eerst eruit

Denk aan een stapel borden. Je legt een schoon bord bovenop en pakt er van bovenaf een als je het nodig hebt. Het laatst toegevoegde bord gaat er het eerst uit. Een stapel is een gegevensstructuur met precies die regel: laatst erin, eerst eruit (LIFO). Er zijn twee hoofdbewerkingen: push legt een waarde bovenop en pop verwijdert de bovenste waarde en geeft haar terug. Veel stapels bieden ook peek, dat de bovenkant bekijkt zonder te verwijderen.

In de MIT-notities van 6.006 is de stapel een speciaal geval van de reeksinterface: insert last(x) en delete last(). Dat vertelt al hoe je er een bouwt. Zet de waarden in een dynamische array en behandel het einde als de bovenkant. In het vorige hoofdstuk was het einde de goedkope kant, dus push en pop kosten elk 1 stap (geamortiseerd, door af en toe kopiëren). De stapelgrootte maakt niets uit. Pop op een stapel met 3 waarden of met 3 miljoen waarden kost dezelfde ene stap.

const stack = [];
stack.push(4);
stack.push(8);
stack.push(5);
console.log(stack.pop());           // 5, the last one pushed
console.log(stack[stack.length - 1]); // peek: 8
console.log(stack.length);          // 2
Laden

Sleep om te draaien. Scroll of knijp om te zoomen.

Een stapel als hoop getekend. Push en pop werken alleen bovenaan. Kies een reeks haakjes en druk op Haakjes controleren om te zien hoe je met een stapel bepaalt of de haakjes in balans zijn.

Haakjes controleren

Een klassieke toepassing van een stapel is controleren of haakjes in balans zijn, iets wat elke code-editor en compiler doet. Lees de tekst van links naar rechts. Elk openingshaakje, (, [ of {, wordt gepusht. Elk sluithaakje moet passen bij de opener bovenop de stapel: zo ja, pop die opener; is de stapel leeg of is de bovenkant een ander soort, dan is de string niet in balans. Aan het einde moet de stapel leeg zijn, anders is een opener nooit gesloten.

Probeer de strings in het lab. {[()()]} vraagt 4 pushes en 4 pops, 8 stappen, en eindigt met een lege stapel. ([)] gaat fout bij het derde teken: de ) komt terwijl [ bovenop ligt. (() bereikt het einde met één ( over. Waarom past een stapel hierbij? Haakjes zijn genest en de laatst geopende moet als eerste sluiten. Dat is laatst erin, eerst eruit.

Waar stapels nog meer voorkomen

  • De aanroepstapel. Als functie a b aanroept en b c aanroept, pusht de computer voor elke aanroep een record. Als c terugkeert, wordt dat record gepopt en gaat b verder waar het stopte. Oneindige recursie vult die stapel: de fout ‘stack overflow’.
  • Ongedaan maken. Een editor pusht elke wijziging. Ongedaan maken popt de nieuwste wijziging en keert die om.
  • Terugknop. Een browser pusht elke pagina die je verlaat; Terug popt de laatste.
  • Diepte-eerst zoeken. Bij algoritmen gebruikte je een stapel om in een doolhof zo diep mogelijk te gaan voordat je terugging.
AchtergrondDe stapel als computeridee wordt meestal teruggevoerd op Friedrich L. Bauer en Klaus Samelson in München. Bij het vertalen van rekenformules bewaarden ze uitgestelde bewerkingen in een opslag waar het laatste toegevoegde item als eerste werd weggenomen. Ze noemden dat de Keller, Duits voor kelder. Ze vroegen in 1957 patent op de methode aan; het werd in de Verenigde Staten in 1962 verleend. Rond dezelfde tijd gebruikte lijstverwerking door Allen Newell, Cliff Shaw en Herbert Simon bij de RAND Corporation ook stapels, omdat hun programma's vol recursie zaten.
  1. In welke volgorde geeft een stapel waarden terug?
    • Eerst erin, eerst eruit
    • Laatst erin, eerst eruit
    • Kleinste eerst
    • Willekeurige volgorde
  2. Begin leeg. Push 4, push 8, push 5, pop, push 2. Wat ligt bovenop?
    • 4
    • 8
    • 5
    • 2
  3. Hoeveel waarden bevat de stapel na die bewerkingen?
  4. Push A, dan B, dan C en pop tot de stapel leeg is. Zet de gepopte waarden op volgorde.
  5. Hoeveel pushes en pops vraagt {[()()]} controleren met de haakjesmethode in totaal?
  6. Waar gaat het controleren van ([)] vanaf links fout?
    • Bij de eerste (
    • Bij [
    • Bij )
    • Bij de laatste ]
  7. Wat is er mis met (() ?
    • Er komt een sluiter bij een lege stapel
    • Aan het einde staat nog één ( op de stapel
    • Vierkante haken ontbreken
    • Niets; het is in balans
  8. Hoeveel stappen kost pop op een stapel (in een dynamische array) met 1000 waarden?
  9. Functie main roept draw aan en draw roept line aan. Welk record ligt bovenop de aanroepstapel terwijl line werkt?
    • main
    • draw
    • line
    • geen
  10. In welk jaar vroegen Bauer en Samelson hun patent op de stapelmethode aan?
    • 1946
    • 1957
    • 1962
    • 1972
Belangrijkste punten
  • Een stapel is laatst erin, eerst eruit: push bovenop, pop van bovenaf.
  • Aan het einde van een dynamische array gebouwd kosten push en pop elk 1 stap.
  • Haakjescontrole pusht openers en popt bij elke sluiter; {[()()]} kost 8 stappen.
  • De aanroepstapel, ongedaan maken en de Terugknop zijn stapels.
Bronnen van deze cursus (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).

Geraadpleegd: 2026-10-18