Springe zu einem wichtigen Kapitel
Stack in der Informatik
Im Bereich der Informatik gehört der Stack zu den abstrakten Datentypen (ADT) und beschreibt eine Datenstruktur, bei der man zu jeder Zeit nur das oberste Element abrufen kann. Auf Deutsch nennt sich der Stack deshalb auch oft „Stapelspeicher“ oder „Kellerspeicher“.
Stack Definition
Ein Stack ist eine dynamische Datenstruktur, bei der nur das oberste Element entnommen und ein neues Element nur ganz oben abgelegt werden kann.
Ein Stack ist im Grunde eine spezielle Form der linearen Liste. Allerdings kann man bei einem Stack nicht auf tiefer liegende Elemente zugreifen, sofern man nicht alle Elemente darüber entfernt. Das LIFO-Prinzip beschreibt genau diese Eigenschaft eines Stacks.
Stack LIFO-Prinzip
Stelle Dir einen Stapel Bücher auf deinem Tisch vor. Zu einer gegebenen Zeit kannst Du ohne Weiteres nur jenes Buch entnehmen, welches zuletzt oben auf den Stapel gelegt wurde.
Genau das beschreibt das Last-in-first-out-Prinzip, oder kurz: LIFO-Prinzip.
Bei einem Stack gibt es drei gängige Operationen, die zum Einsatz kommen.
- Push-Operation: Man legt ein neues Element auf den Stapel.
- Pop-Operation: Man entnimmt das oberste Element vom Stapel.
- Peek-Operation: Man sieht sich das oberste Element auf dem Stapel an, ohne es jedoch zu entnehmen.
Doch wo wird ein Stack überhaupt in der Praxis verwendet?
Praktische Anwendungen für Stacks
Praktische Anwendung findet der Stack vor allem dort, wo man Daten nur temporär speichern möchte.
Ein Beispiel ist die Ausführung eines Programms, die aus verschachtelten Funktionsaufrufen besteht. Diese Aufrufe legt das Programm auf einem Call Stack ab und weiß somit jederzeit, in welcher Funktion es sich gerade befindet und welche Elternfunktion diese aufgerufen hat.
Entwickler nutzen den Call Stack häufig für das Debugging eines Programms.
Ein weiterer Anwendungsfall für den Stack ist die Tiefensuche (Depth-first search). Das ist ein Algorithmus, um einen Knoten in einer Baumstruktur zu finden, und häufig verwendet auch dieses Verfahren die Stack-Datenstruktur.
Zeitkomplexität bei Stack-Operationen
Die Zeitkomplexität beschreibt, wie sich die benötigte Ausführungszeit für einen Algorithmus ändert, wenn sich die Menge der Eingabedaten verändert.
Grundsätzlich ist die Zeitkomplexität eines Algorithmus immer abhängig von der Implementierung des Entwicklers. Bei den Stack-Operationen pop, push und peek ist eine konstante Zeitkomplexität möglich, d.h. ihre Laufzeit ändert sich nicht mit der Menge an Elementen im Stack.
Das lässt sich auch logisch leicht nachvollziehen: Dem Stack ist es egal, wie viele Elemente sich in der Tiefe der Datenstruktur befinden. Laut LIFO-Prinzip kann er ohnehin nur die oberste Position ansteuern.
Stack in bekannten Frameworks
In gängigen Frameworks ist normalerweise eine Implementierung der Stack-Datenstruktur bereits vorhanden. Als Beispiele sollen im Folgenden die Java- und C#-Implementierungen dienen.
Stack: Java-Implementierung
In Java gibt es bereits die Klasse java.util.Stack, welche den Stack Datentyp implementiert. Laut Java-Dokumentation sollten Entwickler diese Klasse allerdings nicht mehr verwenden und stattdessen auf eine Implementierung der Deque-Schnittstelle zurückgreifen.
In Java lässt sich ein Stack am einfachsten mit der ArrayDeque-Klasse und ihren Methoden addFirst(e), removeFirst() und getFirst() implementieren.
Java: Stack- und Queue – Vergleich
Die Queue ist eine andere häufig verwendete Datenstruktur, für die in Java die Schnittstelle Queue im Namensraum java.util.queue existiert. Die Implementierung einer Queue-Klasse lässt sich wie beim Stack ebenfalls leicht über die ArrayDeque-Klasse realisieren.
Die Queue ist dem Stack sehr ähnlich, nur dass die vordersten Elemente wie bei einer Warteschlange im echten Leben zuerst an der Reihe sind. Damit funktioniert die Queue im Gegensatz zum Stack nach dem FIFO-Prinzip: Was zuerst reinkommt, kommt auch zuerst wieder raus.
C# Stack-Implementierung
Die C# Stack-Implementierung befindet sich im Namensraum System.Collections.Generic. Die nicht-generische Implementierung unter System.Collections soll laut Microsoft-Dokumentation nicht mehr verwendet werden.
In C# ist der Stack als Array implementiert. Diese Art der Implementierung wollen wir uns als nächstes ansehen.
Java: Array-Stack Implementierung
Das Java-Framework bietet zwar eine Stack Implementierung an, wie wir gesehen haben. Es lohnt sich aber, zur Übung selbst einen Stack mit einem Array zu implementieren.
Die folgende Implementierung verwendet eine feste Array-Größe, und somit ist auch die Menge an Elementen im Stack darauf begrenzt. Außerdem verzichtet die Implementierung der Einfachheit halber auf die Überprüfung, ob der Zugriff auf das Array in einer Methode valide ist oder ob eine Exception geworfen werden sollte.
public class Stack { private Object[] elements; private int count; public Stack(int capacity) { // Array initialisieren elements = new Object[capacity]; } public void push(Object item) { // Element on top hinzufügen elements[count] = item; // Top Zeiger hochzählen count++; } public Object pop() { // Oberstes Element nehmen Object item = elements[count - 1]; // Im Array die Position auf null setzen elements[count - 1] = null; // Top Zeiger runterzählen count--; return item; } public Object peek() { // Oberstes Element nehmen und zurückgeben Object item = elements[count - 1]; return item; } }
Rekursion und Stack
Eine rekursiv implementierte Methode ruft sich immer wieder selbst auf, bis das gewünschte Ergebnis errechnet ist. Dadurch wird diese Methode durch das Programm mehrfach auf dem Call Stack abgelegt.
Als Beispiel soll uns hier die rekursive Berechnung der Fakultät dienen:
public static void main(String[] args) { fakultaet(4); } long fakultaet(int n) { if (n > 1) { return fakultaet(n - 1); } return 1; }
Die Methode fakultaet(int) ist rekursiv implementiert. Wie wird sich der Aufruf von fakultaet(4) nun im Call Stack widerspiegeln?
Stack-Ebene | Methodenaufruf |
1 (top) | fakultaet(1) |
2 | fakultaet(2) |
3 | fakultaet(3) |
4 | fakultaet(4) |
5 | main(String[]) |
Wenn Du den Programmablauf durchgehst, erkennst Du, dass der letzte Aufruf fakultaet(1) ist. Dieser bildet somit das oberste Element im Stack. Bei dem Rücksprung zum Aufrufer wird der Stack dann Element für Element wieder aufgelöst.
Stack - Das Wichtigste
- Stack Definition: Der Stack in Informatik ist eine dynamische Datenstruktur.
- Das Stack-LIFO-Prinzip besagt, dass das zuletzt abgelegte Element zuerst wieder herausgenommen werden muss. (Last-in-first-out)
- Der Stack in Java besitzt eine Implementierung im Framework, kann aber auch über ein Array selbst implementiert werden. Für den Stack in C# gilt das gleiche.
- Die Java Stack und Queue Datenstrukturen unterscheiden sich vor allem hinsichtlich dessen, wo ein Element wieder entnommen werden kann.
- Rekursion und Stack: Bei der Rekursion einer Methode wird diese für jeden Aufruf ein weiteres Mal auf dem Call Stack abgelegt.
Nachweise
- Güting; Dieker. (2018). Datenstrukturen und Algorithmen. Springer Vieweg.
Lerne mit 7 Stack Karteikarten in der kostenlosen StudySmarter App
Wir haben 14,000 Karteikarten über dynamische Landschaften.
Du hast bereits ein Konto? Anmelden
Häufig gestellte Fragen zum Thema Stack
Was ist ein Stack in der Informatik?
In der Informatik ist der Stack eine Datenstruktur, bei der nur das oberste Element entnommen und ein neues Element nur ganz oben abgelegt werden kann. Das nennt sich LIFO-Prinzip.
Was versteht man unter Stack?
Unter Stack versteht man in der Informatik eine Datenstruktur, die eine spezielle Form der linearen Liste ist.
Was macht ein Stack?
Ein Stack beinhaltet eine beliebige Anzahl an Elementen. Es kann jedoch nur das oberste Element abgerufen, und lediglich oben eins abgelegt werden.
Wo werden Stacks verwendet?
Stack werden oft dort verwendet, wo Daten nur temporär gespeichert werden müssen. Beispiele sind der Call Stack einer Anwendung, oder die Rückwärts-Navigation in einem Browser.
Über StudySmarter
StudySmarter ist ein weltweit anerkanntes Bildungstechnologie-Unternehmen, das eine ganzheitliche Lernplattform für Schüler und Studenten aller Altersstufen und Bildungsniveaus bietet. Unsere Plattform unterstützt das Lernen in einer breiten Palette von Fächern, einschließlich MINT, Sozialwissenschaften und Sprachen, und hilft den Schülern auch, weltweit verschiedene Tests und Prüfungen wie GCSE, A Level, SAT, ACT, Abitur und mehr erfolgreich zu meistern. Wir bieten eine umfangreiche Bibliothek von Lernmaterialien, einschließlich interaktiver Karteikarten, umfassender Lehrbuchlösungen und detaillierter Erklärungen. Die fortschrittliche Technologie und Werkzeuge, die wir zur Verfügung stellen, helfen Schülern, ihre eigenen Lernmaterialien zu erstellen. Die Inhalte von StudySmarter sind nicht nur von Experten geprüft, sondern werden auch regelmäßig aktualisiert, um Genauigkeit und Relevanz zu gewährleisten.
Erfahre mehr