das LIFO-Prinzip erklären und von FIFO unterscheiden,
die Stack-Methoden push, pop, top und isEmpty anwenden,
den Zustand eines Stacks nach mehreren Operationen korrekt vorhersagen,
Queue und Stack an einem konkreten Beispiel vergleichen,
eine Fachklasse mit Stack implementieren (Rangierbahnhof).
Leitfrage: Wie speicherst du Aktionen so, dass immer der letzte Schritt zuerst rückgängig gemacht werden kann?
Dein Lernweg
A1, A2 und der Kompetenzcheck gelten für alle. Wähle genau eine Programmieraufgabe: Rangierbahnhof A3, Browser A4 oder Klammerprüfung im Transfer. Wer sicher ist, kann direkt dort beginnen; die Fading-Aufgaben sind Hilfen. Shop-Protokoll und Stack-mit-Queue sind optional. Danach folgt das eigene Kleinprojekt.
Mermaid-Diagramm
Mermaid-Diagramm wird geladen…
Arbeitsweise: Abruffragen und Kompetenzchecks beantwortest du zuerst allein ohne Unterlagen und KI. Speichere deine eigene Antwort, bevor du die Rückmeldung öffnest. Im Übungsteil darfst du Hilfen nutzen; nenne anschließend, welche Hilfe du gebraucht hast. Bei jedem Programm: erst erwartete Ausgabe und einen Leerfall notieren, dann ausführen und vergleichen.
Voraussetzungen
Hinweis
Du solltest Queue-Methoden, FIFO und das Umschütt-Pattern aus Kap. 01+02 sicher beherrschen.
Übergang: Wenn FIFO falsch ist
Bei der Queue war Fairness wichtig: Wer zuerst kommt, wird zuerst bedient. Deshalb haben wir sogar beim Umschütten dafür gesorgt, dass diese Reihenfolge erhalten bleibt.
Aber nicht jedes Problem ist eine Warteschlange. Bei Undo, Browser-Zurück oder Rückwärtssuche interessiert nicht das erste Element, sondern das letzte.
Die neue Frage lautet: Wie speichert man Schritte so, dass der letzte Schritt zuerst zurückgenommen wird?
Phase 1: Einstieg — Undo braucht LIFO, nicht FIFO
Das Undo-Problem
Du baust eine Undo-Funktion für ein Zeichenprogramm. Aktionen werden gespeichert: Neue Datei, Zeichenstift, Farbeimer.
Exploration – 3 Minuten ohne KI: Welche Aktion muss beim ersten und zweiten Undo zurückgenommen werden? Zeichne einen Speicher und begründe, wo Aktionen hinzugefügt und entfernt werden. Erst danach weiterlesen.
Achtung
Nicht die erste (Neue Datei), sondern die letzte (Farbeimer)! Eine Queue (FIFO) würde die falsche Aktion entfernen. Du brauchst eine Datenstruktur, die die letzte Aktion zuerst zurückgibt.
Rückgriff auf die Queue
Bevor wir den Stack definieren, prüfe das Queue-Prinzip noch einmal:
Was bedeutet FIFO bei einer Queue?
Wenn du A, B, C in eine Queue einfügst und alle entnimmst — in welcher Reihenfolge kommen sie heraus?
Textabgabe
Definition: Stack
Ein Stack (Stapel) arbeitet nach dem LIFO-Prinzip (Last In, First Out): Das zuletzt eingefügte Element wird zuerst entnommen — wie ein Stapel Teller.
Phase 2: Konzeptaufbau — Stack und Rangierbahnhof
Abruf 2 – ohne Nachlesen: Welche Aktion wird bei Undo zuerst zurückgenommen? Wie unterscheidet sich das vom FIFO-Prinzip? Was muss ein erhaltender Queue-Durchlauf wiederherstellen?
Textabgabe
Beim folgenden Beispiel ohne KI: Sage das Ergebnis vorher. Erkläre anschließend einer anderen Person, welche Zeile die Datenstruktur verändert. Erst dann ausführen.
2.1 Stack: Alles passiert oben
Methode
Verändert den Stack?
Vorbedingung
Bedeutung
push(x)
ja
—
legt x oben auf
pop()
falls nicht leer
—
entfernt das oberste Element; leer: keine Änderung; keine Rückgabe
top()
nein
—
liefert das oberste Element; leer: null
isEmpty()
nein
—
prüft, ob der Stack leer ist
Hinweis
Merkregel: Beim Stack passiert alles an einem Zugriffspunkt: oben. Push = oben drauflegen. Pop = oben wegnehmen. Top = oben anschauen.
Queue vs. Stack — gleiche Eingabe, andere Reihenfolge
Sage vorher: Was gibt jede Datenstruktur aus?
IDE lädt…
Ruhige Sicherung: Gleiche Daten, andere Ordnung
Tipp
Queue und Stack unterscheiden sich nicht dadurch, was sie speichern. Sie unterscheiden sich dadurch, welches Element zugänglich ist.
Datenstruktur
Zugriffspunkt
Entnahmereihenfolge
Queue
vorne
zuerst rein, zuerst raus
Stack
oben
zuletzt rein, zuerst raus
Diese Zugriffsregel entscheidet, ob eine Datenstruktur zu einem Problem passt.
Undo-Simulation
IDE lädt…
2.2 Stack programmieren: Rangierbahnhof
Eine Fachklasse Bahnhof hat mehrere Stacks (Gleise). Waggons werden nach Farbe gruppiert. Der vorhandene Methodenname sortiereNachGleis2 meint diese Gruppierung, keine Sortierung nach Größe oder Alphabet.
Mermaid-Diagramm
Mermaid-Diagramm wird geladen…
IDE lädt…
Reflexionsfrage: Warum hat ein Stack nur head und kein tail — im Gegensatz zur Queue?
Code-Pattern
Stack-Pattern
// Sicher ein Element entnehmenif (!s.isEmpty()){ Typ x = s.top(); // Ansehen s.pop(); // Entfernen // x weiterverarbeiten}
Zwei Mini-Checks vor der Übung
1. Ein Stack enthält oben A, darunter B. Was liefert zweimal top()?
2. Nach einmaligem vollständigem Umschütten auf einen Hilfsstack: gleiche Reihenfolge?
Fading – Hilfen nach Bedarf
Hilfen zur gewählten Anwendung
Phase 3: Üben
Hinweis
Retrieval-Check:
Was ist der Unterschied zwischen push/pop und enqueue/dequeue?
Was gibt top() auf einem leeren Stack zurück?
Textabgabe
Abgabe-Aufgaben
A1: Trace — Stack-Operationen (Pflicht)
Sage den Zustand des Stacks nach jeder Operation vorher (oben = links):
Erwartungs-Check: Nach der Gruppierung ist Gleis 1 leer, Gleis 2 enthält oben nach unten Rot,Rot und Gleis 3 Blau,Gruen. Ein erneuter Aufruf ändert nichts.
Implementiere sortiereNachGleis2() im Code oben: Alle "Rot"-Waggons sollen auf Gleis 2, alle anderen auf Gleis 3.
IDE lädt…
A4: BrowserVerlauf (Wahlpflicht, AFB II)
Erwartungs-Check: Nach drei Besuchen führt zurück zur zweiten, dann zur ersten Seite; der dritte Aufruf liefert null. Diese vereinfachte Simulation entfernt auch die letzte Seite; ein echter Browser kann sich anders verhalten. Teste zusätzlich einen anfangs leeren Verlauf.
Entwirf eine Klasse BrowserVerlauf mit Stack:
besuchSeite(String url) — URL auf den Stack pushen
zurueck() — letzte Seite entfernen und die darunter liegende zurückgeben
Was passiert bei zurueck() wenn der Verlauf leer ist? Implementiere einen sicheren Umgang.
IDE lädt…
A5: Analyse — Stack mit Queue simulieren? (Vertiefung)
Kann man einen Stack mit einer (oder mehreren) Queues simulieren? Wenn ja: Skizziere den Algorithmus für push() und pop(). Wenn nein: Erkläre warum nicht.
IDE lädt…
Kompetenzcheck – allein, 8–10 Minuten (Pflicht)
Beantworte die drei Aufgaben ohne Vorlage, Ausführen oder KI. Speichere deine erste Antwort vor dem Vergleich. Eine Partnerlösung ersetzt deine Antwort nicht.
Ein Stack erhält A, B, C. Danach folgen top(), pop(), push(D). Nenne die Rückgabe von top und den Endzustand (oben links).
Wähle für Druckaufträge und das Rücknehmen von Zeichenaktionen jeweils Queue oder Stack und begründe die Zugriffsregel. Zeichne zusätzlich eine verkettete Stack-Umsetzung mit head und next.
Was liefern beziehungsweise bewirken top() und pop() auf dem leeren NRW-Stack? Wie entnimmst du ein Element so, dass du es anschließend noch verarbeiten kannst?
Textabgabe
Neuer Versuch nach gezielter Übung
Stack: push(P), push(Q), pop(), push(R). Gib die Entnahmereihenfolge an und erkläre, weshalb pop nicht direkt an eine String-Variable zugewiesen werden darf.
Textabgabe
Phase 4: Transfer und Vernetzung
Transferaufgabe
Ohne KI: Plane zuerst 4 Minuten deinen Algorithmus und einen Fehlerfall. Du bearbeitest diese Aufgabe nur, wenn du sie als Programmierweg gewählt hast.
Klammerprüfung (Wahlpflicht, AFB II)
Gegeben ist ein String mit runden Klammern, z.B. "((a+b)*(c-d))". Prüfe mit einem Stack, ob die Klammern korrekt geöffnet und geschlossen werden.
Algorithmus: Durchlaufe den String zeichenweise. Bei ( → push. Bei ) prüfst du zuerst: Ist der Stack leer, gib sofort false zurück; sonst pop. Andere Zeichen ignorierst du. Am Ende muss der Stack leer sein. Nur den Endzustand zu prüfen würde z. B. a+b) fälschlich akzeptieren.
Implementiere die Methode boolean istKorrektGeklammert(String ausdruck).
IDE lädt…
Wahlübung: Aktionsprotokoll für einen Warenkorb
Durchgaengiges Projekt: Online-Shop
Der Stack eignet sich perfekt fuer eine Undo-Funktion: Jede Aktion wird auf den Stack gelegt. Bei "Rueckgaengig" wird die letzte Aktion vom Stack genommen und umgekehrt.
Projektstand Online-Shop
Diese Simulation speichert ein Aktionsprotokoll und gibt die zurückzunehmende Aktion aus. Ein tatsächlicher Warenkorbzustand wird hier noch nicht verändert. Im eigenen Projekt setzt du eine kleine Zustandsänderung wirklich um.
Das ist ein anderer Projektfortschritt als bei der Queue: Nicht die faire Abarbeitung steht im Mittelpunkt, sondern das kontrollierte Zurücknehmen.
Online-Shop: Undo-Protokoll (optional)
Ein Kunde fuegt Produkte zum Warenkorb hinzu oder entfernt sie. Jede Aktion wird auf einem Stack gespeichert, damit sie rueckgaengig gemacht werden kann.
Klasse WarenkorbAktion (typ: String, produkt: String) -- typ ist "HINZUFUEGEN" oder "ENTFERNEN"
Klasse AktionsVerlauf mit Stack<WarenkorbAktion>
aktionAusfuehren(WarenkorbAktion a) -- Aktion auf den Stack legen (push)
rueckgaengig() -- letzte Aktion vom Stack nehmen (pop) und ausgeben, was rueckgaengig gemacht wurde
Erwartungs-Check: Vier Rücknahmen melden die Aktionen in umgekehrter Reihenfolge, erst die fünfte meldet „Keine Aktionen mehr“. Das Protokoll allein verändert noch keinen Warenkorb.
Implementiere beide Klassen und teste mit dem vorgegebenen Main.
IDE lädt…
Vernetzung
Heute gelöst: Du kennst jetzt beide Grundprinzipien: FIFO bei der Queue und LIFO beim Stack. Du kannst erklären, warum Undo, Browser-Zurück und Rangieren nicht mit einer Queue gelöst werden sollten.
Noch offen: Bisher war der Stack vor allem ein Speicher für letzte Aktionen. Interessant wird er, wenn er nicht nur speichert, sondern beim Denken hilft: beim Sortieren, Zurückgehen und systematischen Suchen.
Nächster Schritt: In Meine Mini-Welt entscheidest du selbst, wie Queue und Stack zusammenarbeiten. Danach kannst du Sortieren und Backtracking vertiefen.
Reflexion
Hinweis
Beantworte die Leitfrage: Wann brauchst du einen Stack statt einer Queue? Nenne zwei konkrete Situationen.
Textabgabe
Selbstdiagnose
Ich kann LIFO erklären und von FIFO unterscheiden.
Ich kann den Zustand eines Stacks nach mehreren Operationen vorhersagen.
Ich kann eine Fachklasse mit Stack implementieren.
Partnerprüfung oder Solo-Erklärung (5 Minuten)
Erkläre 2 Minuten lang deine gewählte Methode. Dein Gegenüber prüft einen Randfall und fragt: „Warum bleibt die Reihenfolge hier erhalten oder ändert sich?“ Wechselt dann die Rollen. Allein: Schreibe die Erklärung und beantworte dieselbe Frage schriftlich. Vergleiche mit dem passenden Beispiel und verbessere einen unklaren Satz.
Selbstdiagnose: Welchen Ablauf, welche Begründung und welchen Randfall kannst du ohne Hilfe erklären? Nenne jeweils eine konkrete Aufgabe als Beleg. Wie sicher bist du (1–5)? Bei 1–2 bearbeitest du eine passende Hilfe und den neuen Versuch; bei 4–5 wählst du eine eigene Erweiterung.