3.4 Stack (Kellerspeicher, Stapel)
Die Klasse Stack repräsentiert einen Stapelspeicher, auch Keller genannt, der als LIFO-(Last-in-First-out-)Datenstruktur definiert ist. Beim Hinzufügen von Elementen wächst die Datenstruktur dynamisch. Die Klasse Stack ist eine Erweiterung der Klasse Vector (wir diskutieren diese prickelnde Designentscheidung weiter unten im Abschnitt »Ein Stack ist ein Vector – aha!«), womit die Klasse zusätzliche Funktionalität besitzt, beispielsweise die Fähigkeit zur Aufzählung und zum wahlfreien Zugriff auf Kellerelemente.
Beispiel |
Füge in den Stack zwei Strings ein, und lies sie wieder aus: Stack<String> stack = new Stack<String>(); |
3.4.1 Die Methoden von Stack
Stack besitzt nur wenige zusätzliche Methoden.
class java.util.Stack<E> |
- Stack()
Der Konstruktor erzeugt einen neuen Stack. - boolean empty()
Testet, ob Elemente auf dem Stapel vorhanden sind. - E push(E item)
Das Element item wird auf den Stapel gebracht. - E pop()
Holt das letzte Element vom Stapel. EmptyStackException signalisiert einen leeren Stapel. - E peek()
Das oberste Element wird nur vom Stapel gelesen, aber nicht wie bei pop() entfernt. Bei leerem Stapel wird eine EmptyStackException ausgelöst. - int search(Object o)
Sucht im Stapel nach dem obersten Eintrag, der mit dem Objekt o übereinstimmt. Gibt die Distanz von der Spitze zurück oder –1, falls das Objekt nicht im Stapel ist. 1 bedeutet, dass der gesuchte Eintrag ganz oben auf dem Stapelspeicher liegt, 2 bezeichnet die zweitoberste Position und so weiter. Die Zählweise ist ungewöhnlich, da sie nicht nullbasiert ist wie alle anderen Methoden, die mit Positionen arbeiten. Doch hier handelt es sich ausdrücklich um die Distanz und nicht um die Position!
Ein Stack ist ein Vector – aha!
Eine genaue Betrachtung der Klasse Stack zeigt den unsinnigen und falschen Einsatz der Vererbung, und es stellt sich die Frage, warum sich der Autor Jonathan Payne für jene Variante entschieden hat. Stack erbt alle Methoden von Vector (einer List) und damit viele Methoden, die im krassen Gegensatz zu den charakteristischen Eigenschaften eines Stapels stehen. Dazu zählen unter anderem die Methoden elementAt(), indexOf(), insertElementAt(), removeElementAt(), setElementAt() und weitere. Wenn eine Unterklasse nicht bedingungslos alle Eigenschaften der Oberklasse unterstützt, ist die Vererbung falsch angewendet.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.