MINT lernen

Algorithmen mit Stapeln

Wie merkt ein Programm, dass in (a + [b) · c] eine Klammer falsch sitzt? Ein Stapel verrät es.

1

Mit Hilfsstapeln arbeiten

Ein Stapel kennt nur sein oberstes Element. Wer alle Elemente ansehen will, muss sie herunternehmen — und irgendwo ablegen.

  • Umkehren:alle Elemente nacheinander pushen und danach alle poppen — die Reihenfolge dreht sich um.
  • Durchsehen:solange !s.isEmpty(): oberstes Element mit pop() nehmen, bearbeiten, auf einen Hilfsstapel legen.
  • Zurückladen:danach alles vom Hilfsstapel zurück — so steht der Originalstapel wieder wie vorher.
  • Warum?Ein Stapel hat keine Operation getLength(); selbst die Anzahl bestimmt man so.
public int anzahl(Stack<String> s) {
    Stack<String> hilf = new Stack<String>();
    int n = 0;
    while (!s.isEmpty()) {       // umladen und zählen
        hilf.push(s.pop());
        n++;
    }
    while (!hilf.isEmpty()) {    // zurückladen
        s.push(hilf.pop());
    }
    return n;
}
2

Klammern mit dem Stapel prüfen

Compiler und Taschenrechner prüfen vor dem Rechnen, ob Klammern richtig gesetzt sind. Die Idee: Jede öffnende Klammer wartet auf dem Stapel auf ihr Gegenstück.

  • Öffnend:( [ { wird mit push auf den Stapel gelegt.
  • Schließend:Stapel leer → Fehler. Sonst mit pop() die oberste öffnende Klammer holen — sie muss zur schließenden passen.
  • Ende:Liegt noch etwas auf dem Stapel, fehlt eine schließende Klammer.

Sieh dir den Ausdruck an und tippe: korrekt geklammert oder fehlerhaft? Dann zeigt „Prüfen“, wie der Stapel Zeichen für Zeichen arbeitet.

Klammer-Detektiv

Halte fest: Ein Klammerausdruck ist genau dann korrekt, wenn keine schließende Klammer auf einen leeren Stapel oder eine falsche Klammer trifft und der Stapel am Ende leer ist.

Merke

Korrekt geklammert: jede schließende Klammer passt zum pop() — und am Ende gilt isEmpty().

3

Allgemeine Hinweise

Vor pop() prüfen

Beim Ausdruck )( trifft die erste Klammer auf einen leeren Stapel. Ohne isEmpty()-Abfrage stürzt das Programm ab.

Ende nicht vergessen

Bei (() passt jede schließende Klammer — trotzdem ist der Ausdruck falsch, weil am Ende noch ( im Stapel liegt.

Original erhalten

Soll der Stapel nach dem Algorithmus unverändert sein, alles auf einen Hilfsstapel umladen und am Schluss zurückladen.

Videos