Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Stack-Datenstruktur in Java | Fortgeschrittene Datenstrukturen in Java
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Java Datenstrukturen

bookStack-Datenstruktur in Java

Ein Stack ist eine Datenstruktur, die dem Last In, First Out (LIFO)-Prinzip folgt. Dasselbe Prinzip gilt für eine Deque, die zuvor behandelt wurde, und Java-Entwickler empfehlen die Verwendung einer Deque, wenn eine Datenstruktur nach dem LIFO-Prinzip arbeiten soll. Die Stack-Datenstruktur ist veraltet und wird in der modernen Java-Entwicklung nicht empfohlen.

Einige Collections werden nicht mehr empfohlen und sind veraltet.

Veraltet

Wenn ein Element als veraltet gekennzeichnet ist, bedeutet dies, dass die Autoren der Bibliothek oder Programmiersprache von der Verwendung in neuem Code abraten und empfehlen, neue Methoden, Klassen oder Ansätze zu verwenden, die möglicherweise sicherere, effizientere oder funktionalere Lösungen bieten.

Ein Beispiel ist die Klasse Vector in Java. Ihre Methoden wurden zugunsten modernerer Collections wie ArrayList und LinkedList als veraltet markiert. Wenn ein Programmierer dennoch Vector-Methoden verwendet, kann der Compiler eine Warnung ausgeben, dass diese Methoden veraltet sind.

Beispiel in Java:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.Vector; public class Main { public static void main(String[] args) { Vector<String> vector = new Vector<>(); // Adding an element (this method is deprecated) vector.addElement("Item"); // Compiler warning about the deprecated method // Note: 'addElement(java.lang.Object)' is deprecated. System.out.println(vector.get(0)); } }

Daher wird nicht empfohlen, eine Datenstruktur wie Stack zu verwenden, dennoch wird sie in diesem Kapitel behandelt, da sie eine interessante Datenstruktur ist, die beispielsweise in Java Stack-Speicher verwendet wird.

Stack

Kompakt zusammengefasst, hier sind die Methoden der Stack-Klasse:

Methoden

push(E element): fügt ein Element oben auf den Stack hinzu.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); } }

Das Hinzufügen erfolgt auf die gleiche Weise wie bei ArrayList, daher betrachten wir direkt diese Methode in Kombination mit der pop()-Methode:

pop(): entfernt und gibt das Element vom oberen Ende des Stapels zurück.

Main.java

Main.java

copy
1234567891011121314
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); stack.pop(); System.out.println("Stack after the `pop()` method: " + stack); } }

Diese Methode entfernt ein Element vom oberen Ende des Stapels. Beachte, dass die pop()-Methode das zuletzt hinzugefügte Element vom Stapel entfernt. Genau so funktioniert das LIFO-Prinzip.

Du kannst auch sehen, welches Element sich oben auf dem Stapel befindet:

peek(): gibt das Element vom oberen Ende des Stapels zurück ohne es zu entfernen.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); String top = stack.peek(); System.out.println("Top element of the stack: " + top); System.out.println("Stack after the `peek()` method: " + stack); } }

Mit dieser Methode wird das oberste Element im Stack betrachtet.

Verwendung

Ein Beispiel für die Nutzung der Stack-Datenstruktur ist die Navigation zwischen Seiten in einem Browser (diese Vorwärts- und Zurück-Pfeile, die häufig verwendet werden).

Planung der Implementierung des Browser-Verlaufs und Implementierung von Methoden für zwei Schaltflächen (goBack() und goForward()). Falls unklar ist, auf welche Schaltflächen Bezug genommen wird: Es handelt sich um diese Navigationsschaltflächen:

Implementierung einer Klasse mit Methoden zur Bedienung dieser beiden Schaltflächen unter Verwendung der Stack-Datenstruktur.

Funktionsweise

Verwendung von zwei Stacks und einer String-Variablen. Der erste Stack speichert die Links, die durch Klicken auf den "Zurück"-Pfeil aufgerufen werden. Der zweite Stack speichert die Links, die durch Klicken auf den "Vorwärts"-Pfeil aufgerufen werden. Zusätzlich gibt es eine String-Variable, die den aktuellen Seitenlink speichert.

Diese Klasse enthält vier Methoden: visitPage(), goBack(), goForward() und getCurrentPage(). Schrittweise Erläuterung folgt.

Die Methode visitPage() leitet zur im Parameter angegebenen URL weiter. Beim Wechsel zu einer neuen Seite wird der alte Link zum backStack hinzugefügt. Der forwardStack wird geleert, sobald eine neue Seite aufgerufen wird.

Implementierung im Code:

BrowserHistory.java

BrowserHistory.java

copy
1234567891011121314151617181920212223242526
import java.util.Stack; public class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } }

Auf diese Weise ist es möglich, zur vorherigen Seite zurückzukehren, wenn zu einer neuen Seite navigiert wird.

Implementierung der Methode zum Zurückgehen. Funktionsweise: Der aktuelle Link wird zum forwardStack hinzugefügt, anschließend wird dieser Link aus dem backStack entfernt und currentUrl zugewiesen.

Implementierung im Code:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } }

Zur Erinnerung: Die Methode pop() entfernt das Element vom oberen Ende des Stacks und gibt es zurück. Daher wird mit dieser Methode der Wert der URL direkt der Variablen currentUrl zugewiesen.

Es wird außerdem überprüft, ob der backStack nicht leer ist; andernfalls ist ein Zurückkehren zum vorherigen Link nicht möglich (da dieser schlichtweg nicht existiert). Ist der Stack leer, wird eine entsprechende Meldung ausgegeben.

Nach demselben Prinzip wird die Methode zur Navigation zur vorwärtsliegenden Seite implementiert. Hierbei werden die Elemente im Stack einfach vertauscht:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } }

Nun bleibt nur noch die Implementierung der Methode getCurrentPage(), die einfach den Wert von currentUrl zurückgibt.

Testen

Als Nächstes wird alles im main-Methode getestet. Die Methode visitPage() wird dreimal verwendet, um sicherzustellen, dass diese Links in der Historie gespeichert werden. Anschließend wird die Methode goBack() zweimal und danach die Methode goForward() einmal verwendet, um die Funktionalität der geschriebenen Methoden zu überprüfen.

Während dieses Prozesses wird der Zustand mit der Methode getCurrentPage() verfolgt. Der untenstehende Code kann ausgeführt werden; es ist auch möglich, weitere Links einzufügen und verschiedene Methoden zu verwenden, um die Funktionalität dieser Klasse zu testen:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
package com.example; import java.util.Stack; class Main { public static void main(String[] args) { BrowserHistory browser = new BrowserHistory(); System.out.println("Default page: " + browser.getCurrentPage()); browser.visitPage("https://codefinity.com/courses/tracks/7dfbcd35-5cde-49d3-80f1-bf1096487903"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/e66c57b4-5f36-43b2-bd3b-e1398044fcab"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/1585fb29-47cd-47a6-9fb3-5b391cad24e0"); System.out.println("Current Page after visiting 3 pages: " + browser.getCurrentPage()); browser.goBack(); browser.goBack(); System.out.println("Current Page after going back 2 times: " + browser.getCurrentPage()); browser.goForward(); System.out.println("Current Page after going forward: " + browser.getCurrentPage()); } } class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } } public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } } public String getCurrentPage() { return currentUrl; } }

Beachten Sie, dass die Klasse Stack veraltet ist und für die moderne Java-Entwicklung nicht empfohlen wird. Stattdessen sollte Deque verwendet werden, da dies eine effizientere Alternative ist. In diesem Beispiel wird Stack nach dem LIFO-Prinzip implementiert; alternativ kann auch Deque verwendet werden, da es sich um eine doppelt verkettete Warteschlange handelt, die sowohl das FIFO- als auch das LIFO-Prinzip unterstützt.

1. Was ist das grundlegende Prinzip einer Stack-Datenstruktur?

2. Welche Methode wird in Java verwendet, um ein Element oben auf den Stack hinzuzufügen?

3. Welche der folgenden Java-Collections gilt als moderne Alternative zu Stack?

4. Was gibt die Methode pop() eines Stack in Java zurück?

question mark

Was ist das grundlegende Prinzip einer Stack-Datenstruktur?

Select the correct answer

question mark

Welche Methode wird in Java verwendet, um ein Element oben auf den Stack hinzuzufügen?

Select the correct answer

question mark

Welche der folgenden Java-Collections gilt als moderne Alternative zu Stack?

Select the correct answer

question mark

Was gibt die Methode pop() eines Stack in Java zurück?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

What are the main differences between Stack and Deque in Java?

Can you show how to implement the same browser history example using Deque?

Why is Stack considered obsolete in Java?

bookStack-Datenstruktur in Java

Swipe um das Menü anzuzeigen

Ein Stack ist eine Datenstruktur, die dem Last In, First Out (LIFO)-Prinzip folgt. Dasselbe Prinzip gilt für eine Deque, die zuvor behandelt wurde, und Java-Entwickler empfehlen die Verwendung einer Deque, wenn eine Datenstruktur nach dem LIFO-Prinzip arbeiten soll. Die Stack-Datenstruktur ist veraltet und wird in der modernen Java-Entwicklung nicht empfohlen.

Einige Collections werden nicht mehr empfohlen und sind veraltet.

Veraltet

Wenn ein Element als veraltet gekennzeichnet ist, bedeutet dies, dass die Autoren der Bibliothek oder Programmiersprache von der Verwendung in neuem Code abraten und empfehlen, neue Methoden, Klassen oder Ansätze zu verwenden, die möglicherweise sicherere, effizientere oder funktionalere Lösungen bieten.

Ein Beispiel ist die Klasse Vector in Java. Ihre Methoden wurden zugunsten modernerer Collections wie ArrayList und LinkedList als veraltet markiert. Wenn ein Programmierer dennoch Vector-Methoden verwendet, kann der Compiler eine Warnung ausgeben, dass diese Methoden veraltet sind.

Beispiel in Java:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.Vector; public class Main { public static void main(String[] args) { Vector<String> vector = new Vector<>(); // Adding an element (this method is deprecated) vector.addElement("Item"); // Compiler warning about the deprecated method // Note: 'addElement(java.lang.Object)' is deprecated. System.out.println(vector.get(0)); } }

Daher wird nicht empfohlen, eine Datenstruktur wie Stack zu verwenden, dennoch wird sie in diesem Kapitel behandelt, da sie eine interessante Datenstruktur ist, die beispielsweise in Java Stack-Speicher verwendet wird.

Stack

Kompakt zusammengefasst, hier sind die Methoden der Stack-Klasse:

Methoden

push(E element): fügt ein Element oben auf den Stack hinzu.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); } }

Das Hinzufügen erfolgt auf die gleiche Weise wie bei ArrayList, daher betrachten wir direkt diese Methode in Kombination mit der pop()-Methode:

pop(): entfernt und gibt das Element vom oberen Ende des Stapels zurück.

Main.java

Main.java

copy
1234567891011121314
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); stack.pop(); System.out.println("Stack after the `pop()` method: " + stack); } }

Diese Methode entfernt ein Element vom oberen Ende des Stapels. Beachte, dass die pop()-Methode das zuletzt hinzugefügte Element vom Stapel entfernt. Genau so funktioniert das LIFO-Prinzip.

Du kannst auch sehen, welches Element sich oben auf dem Stapel befindet:

peek(): gibt das Element vom oberen Ende des Stapels zurück ohne es zu entfernen.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Stack; public class Main { public static void main(String[] args) { Stack<String> stack = new Stack<>(); stack.push("One"); stack.push("Two"); System.out.println("Stack: " + stack); String top = stack.peek(); System.out.println("Top element of the stack: " + top); System.out.println("Stack after the `peek()` method: " + stack); } }

Mit dieser Methode wird das oberste Element im Stack betrachtet.

Verwendung

Ein Beispiel für die Nutzung der Stack-Datenstruktur ist die Navigation zwischen Seiten in einem Browser (diese Vorwärts- und Zurück-Pfeile, die häufig verwendet werden).

Planung der Implementierung des Browser-Verlaufs und Implementierung von Methoden für zwei Schaltflächen (goBack() und goForward()). Falls unklar ist, auf welche Schaltflächen Bezug genommen wird: Es handelt sich um diese Navigationsschaltflächen:

Implementierung einer Klasse mit Methoden zur Bedienung dieser beiden Schaltflächen unter Verwendung der Stack-Datenstruktur.

Funktionsweise

Verwendung von zwei Stacks und einer String-Variablen. Der erste Stack speichert die Links, die durch Klicken auf den "Zurück"-Pfeil aufgerufen werden. Der zweite Stack speichert die Links, die durch Klicken auf den "Vorwärts"-Pfeil aufgerufen werden. Zusätzlich gibt es eine String-Variable, die den aktuellen Seitenlink speichert.

Diese Klasse enthält vier Methoden: visitPage(), goBack(), goForward() und getCurrentPage(). Schrittweise Erläuterung folgt.

Die Methode visitPage() leitet zur im Parameter angegebenen URL weiter. Beim Wechsel zu einer neuen Seite wird der alte Link zum backStack hinzugefügt. Der forwardStack wird geleert, sobald eine neue Seite aufgerufen wird.

Implementierung im Code:

BrowserHistory.java

BrowserHistory.java

copy
1234567891011121314151617181920212223242526
import java.util.Stack; public class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } }

Auf diese Weise ist es möglich, zur vorherigen Seite zurückzukehren, wenn zu einer neuen Seite navigiert wird.

Implementierung der Methode zum Zurückgehen. Funktionsweise: Der aktuelle Link wird zum forwardStack hinzugefügt, anschließend wird dieser Link aus dem backStack entfernt und currentUrl zugewiesen.

Implementierung im Code:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } }

Zur Erinnerung: Die Methode pop() entfernt das Element vom oberen Ende des Stacks und gibt es zurück. Daher wird mit dieser Methode der Wert der URL direkt der Variablen currentUrl zugewiesen.

Es wird außerdem überprüft, ob der backStack nicht leer ist; andernfalls ist ein Zurückkehren zum vorherigen Link nicht möglich (da dieser schlichtweg nicht existiert). Ist der Stack leer, wird eine entsprechende Meldung ausgegeben.

Nach demselben Prinzip wird die Methode zur Navigation zur vorwärtsliegenden Seite implementiert. Hierbei werden die Elemente im Stack einfach vertauscht:

BrowserHistory.java

BrowserHistory.java

copy
12345678910
public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } }

Nun bleibt nur noch die Implementierung der Methode getCurrentPage(), die einfach den Wert von currentUrl zurückgibt.

Testen

Als Nächstes wird alles im main-Methode getestet. Die Methode visitPage() wird dreimal verwendet, um sicherzustellen, dass diese Links in der Historie gespeichert werden. Anschließend wird die Methode goBack() zweimal und danach die Methode goForward() einmal verwendet, um die Funktionalität der geschriebenen Methoden zu überprüfen.

Während dieses Prozesses wird der Zustand mit der Methode getCurrentPage() verfolgt. Der untenstehende Code kann ausgeführt werden; es ist auch möglich, weitere Links einzufügen und verschiedene Methoden zu verwenden, um die Funktionalität dieser Klasse zu testen:

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
package com.example; import java.util.Stack; class Main { public static void main(String[] args) { BrowserHistory browser = new BrowserHistory(); System.out.println("Default page: " + browser.getCurrentPage()); browser.visitPage("https://codefinity.com/courses/tracks/7dfbcd35-5cde-49d3-80f1-bf1096487903"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/e66c57b4-5f36-43b2-bd3b-e1398044fcab"); browser.visitPage("https://codefinity.com/courses/v2/8204075c-f832-4cb9-88b1-4e24e74ebdcb/bb00e195-715e-477d-8927-964e6e27cf16/1585fb29-47cd-47a6-9fb3-5b391cad24e0"); System.out.println("Current Page after visiting 3 pages: " + browser.getCurrentPage()); browser.goBack(); browser.goBack(); System.out.println("Current Page after going back 2 times: " + browser.getCurrentPage()); browser.goForward(); System.out.println("Current Page after going forward: " + browser.getCurrentPage()); } } class BrowserHistory { private Stack<String> backStack; private Stack<String> forwardStack; private String currentUrl; public BrowserHistory() { backStack = new Stack<>(); forwardStack = new Stack<>(); currentUrl = "https://codefinity.com/profile/my-home"; } public void visitPage(String url) { // When visiting a new page, add the current page to the "back" stack backStack.push(currentUrl); // Reset the "forward" stack as we moved to a new page forwardStack.clear(); // Set the current page to the new URL currentUrl = url; System.out.println("Visited page: " + url); } public void goBack() { if (!backStack.isEmpty()) { // Navigate to the previous page, move from the backStack to the forwardStack forwardStack.push(currentUrl); currentUrl = backStack.pop(); System.out.println("Went back to: " + currentUrl); } else { System.out.println("Cannot go back. Already at the beginning."); } } public void goForward() { if (!forwardStack.isEmpty()) { // Navigate to the next page, move from the forwardStack to the backStack backStack.push(currentUrl); currentUrl = forwardStack.pop(); System.out.println("Went forward to: " + currentUrl); } else { System.out.println("Cannot go forward. Already at the latest page."); } } public String getCurrentPage() { return currentUrl; } }

Beachten Sie, dass die Klasse Stack veraltet ist und für die moderne Java-Entwicklung nicht empfohlen wird. Stattdessen sollte Deque verwendet werden, da dies eine effizientere Alternative ist. In diesem Beispiel wird Stack nach dem LIFO-Prinzip implementiert; alternativ kann auch Deque verwendet werden, da es sich um eine doppelt verkettete Warteschlange handelt, die sowohl das FIFO- als auch das LIFO-Prinzip unterstützt.

1. Was ist das grundlegende Prinzip einer Stack-Datenstruktur?

2. Welche Methode wird in Java verwendet, um ein Element oben auf den Stack hinzuzufügen?

3. Welche der folgenden Java-Collections gilt als moderne Alternative zu Stack?

4. Was gibt die Methode pop() eines Stack in Java zurück?

question mark

Was ist das grundlegende Prinzip einer Stack-Datenstruktur?

Select the correct answer

question mark

Welche Methode wird in Java verwendet, um ein Element oben auf den Stack hinzuzufügen?

Select the correct answer

question mark

Welche der folgenden Java-Collections gilt als moderne Alternative zu Stack?

Select the correct answer

question mark

Was gibt die Methode pop() eines Stack in Java zurück?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 2. Kapitel 4
some-alt