Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Stackdatastructuur in Java | Geavanceerde Datastructuren in Java
Java Datastructuren

bookStackdatastructuur in Java

Een Stack is een datastructuur die het Last In, First Out (LIFO)-principe volgt. Ditzelfde principe geldt voor een Deque, waarmee je eerder hebt kennisgemaakt, en Java-ontwikkelaars raden aan om een Deque te gebruiken wanneer een datastructuur volgens het LIFO-principe moet werken. De Stack-datastructuur is verouderd en niet aanbevolen in moderne Java-ontwikkeling.

Sommige collecties worden niet langer aanbevolen en zijn verouderd verklaard.

Verouderd

Wanneer een element als verouderd wordt gemarkeerd, betekent dit dat de auteurs van de bibliotheek of programmeertaal het gebruik ervan afraden in nieuwe code en adviseren om nieuwe methoden, klassen of benaderingen te gebruiken die mogelijk veiligere, efficiëntere of functionelere oplossingen bieden.

Een voorbeeld is de Vector-klasse in Java. De methoden hiervan zijn verouderd ten gunste van modernere collecties zoals ArrayList en LinkedList. Als een programmeur toch Vector-methoden gebruikt, kan de compiler een waarschuwing geven dat deze methoden verouderd zijn.

Voorbeeld 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)); } }

Daarom is het niet aanbevolen om een datastructuur zoals Stack te gebruiken, maar we bespreken deze in dit hoofdstuk omdat het een interessante datastructuur is die bijvoorbeeld wordt gebruikt in Java Stack-geheugen.

Stack

Kort en bondig, hier volgt een overzicht van de methoden van de Stack-klasse:

Methoden

push(E element): voegt een element bovenop de stack toe.

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); } }

Toevoegen gebeurt op dezelfde manier als bij ArrayList, dus laten we direct naar deze methode kijken in combinatie met de pop()-methode:

pop(): verwijdert en retourneert het element van de bovenkant van de stack.

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); } }

Deze methode verwijdert één element van de bovenkant van de stack. Merk op dat de pop()-methode het laatst toegevoegde element uit de stack verwijdert. Dat is precies hoe het LIFO-principe werkt.

Het is ook mogelijk om te zien welk element zich bovenaan de stack bevindt:

peek(): retourneert het element van de bovenkant van de stack zonder het te verwijderen.

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); } }

Met deze methode wordt het bovenste element van de stack bekeken.

Gebruik

Beschouw een voorbeeld van het gebruik van de Stack datastructuur voor het navigeren tussen pagina's in een browser (die vooruit- en terug-pijlen die je vaak gebruikt).

Laten we de implementatie van de browsergeschiedenis plannen en methoden implementeren voor twee knoppen (goBack() en goForward()). Als je niet zeker weet over welke knoppen het gaat, bedoel ik deze navigatieknoppen:

Laten we een klasse implementeren die methoden bevat voor het bedienen van deze twee knoppen met behulp van de Stack datastructuur.

Werking

Er zijn twee stacks en een String-variabele. De eerste stack slaat de links op waarnaar we navigeren door op de "terug"-pijl te klikken. De tweede stack slaat de links op waarnaar je navigeert door op de "vooruit"-pijl te klikken. Daarnaast is er een String-variabele die de link van de huidige pagina opslaat.

In deze klasse zijn er vier methoden: visitPage(), goBack(), goForward() en getCurrentPage(). We behandelen ze stap voor stap.

De methode visitPage() zal doorsturen naar de URL die als parameter is opgegeven. Bij het navigeren naar een nieuwe pagina wordt de oude link toegevoegd aan de backStack. De forwardStack wordt geleegd wanneer je naar een nieuwe pagina gaat.

Bekijk de implementatie in de 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); } }

Op deze manier kunnen we terugkeren naar de vorige pagina bij het navigeren naar een nieuwe pagina.

Laten we de methode voor teruggaan implementeren. Deze werkt als volgt: we voegen de huidige link toe aan de forwardStack, vervolgens verwijderen we deze link uit de backStack en wijzen deze toe aan currentUrl.

Bekijk de implementatie in de 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."); } }

Ter herinnering: de methode pop() verwijdert het element van de bovenkant van de stack en geeft het terug. Met deze methode wijzen we dus direct de waarde van de URL toe aan de variabele currentUrl.

We controleren ook of de backStack niet leeg is; anders is het niet mogelijk om terug te gaan naar de vorige link (omdat deze er simpelweg niet is). Als de stack leeg is, tonen we een bijbehorende melding.

Op dezelfde manier implementeren we de methode voor het navigeren naar de volgende pagina. We wisselen eenvoudigweg de elementen in de stack om:

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."); } }

Nu rest alleen nog het implementeren van de methode getCurrentPage(), die eenvoudigweg de waarde van currentUrl retourneert.

Testen

Vervolgens testen we dit alles in de main-methode. We gebruiken de methode visitPage() drie keer om te controleren of deze links worden opgeslagen in de geschiedenis. Daarna gebruiken we de methode goBack() twee keer, gevolgd door de methode goForward() één keer, om de functionaliteit van de geschreven methoden te verifiëren.

Tijdens dit proces houden we onze status bij met behulp van de methode getCurrentPage(). Je kunt onderstaande code uitvoeren en ook proberen meer links toe te voegen en verschillende methoden te gebruiken om de functionaliteit van deze klasse te 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; } }

Onthoud dat de klasse Stack verouderd is en niet wordt aanbevolen voor gebruik in moderne Java-ontwikkeling. Gebruik in plaats daarvan liever Deque, wat een efficiënter alternatief is. In dit voorbeeld is Stack geïmplementeerd op basis van het LIFO-principe, en je kunt ook Deque implementeren, aangezien dit een dubbelzijdige wachtrij is die zowel het FIFO- als het LIFO-principe ondersteunt.

1. Wat is het belangrijkste principe van een Stack datastructuur?

2. Welke methode wordt gebruikt om een element bovenop de stack toe te voegen in Java?

3. Welke van de volgende Java-collecties wordt beschouwd als een modern alternatief voor Stack?

4. Wat retourneert de methode pop() van een Stack in Java?

question mark

Wat is het belangrijkste principe van een Stack datastructuur?

Select the correct answer

question mark

Welke methode wordt gebruikt om een element bovenop de stack toe te voegen in Java?

Select the correct answer

question mark

Welke van de volgende Java-collecties wordt beschouwd als een modern alternatief voor Stack?

Select the correct answer

question mark

Wat retourneert de methode pop() van een Stack in Java?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 4

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

bookStackdatastructuur in Java

Veeg om het menu te tonen

Een Stack is een datastructuur die het Last In, First Out (LIFO)-principe volgt. Ditzelfde principe geldt voor een Deque, waarmee je eerder hebt kennisgemaakt, en Java-ontwikkelaars raden aan om een Deque te gebruiken wanneer een datastructuur volgens het LIFO-principe moet werken. De Stack-datastructuur is verouderd en niet aanbevolen in moderne Java-ontwikkeling.

Sommige collecties worden niet langer aanbevolen en zijn verouderd verklaard.

Verouderd

Wanneer een element als verouderd wordt gemarkeerd, betekent dit dat de auteurs van de bibliotheek of programmeertaal het gebruik ervan afraden in nieuwe code en adviseren om nieuwe methoden, klassen of benaderingen te gebruiken die mogelijk veiligere, efficiëntere of functionelere oplossingen bieden.

Een voorbeeld is de Vector-klasse in Java. De methoden hiervan zijn verouderd ten gunste van modernere collecties zoals ArrayList en LinkedList. Als een programmeur toch Vector-methoden gebruikt, kan de compiler een waarschuwing geven dat deze methoden verouderd zijn.

Voorbeeld 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)); } }

Daarom is het niet aanbevolen om een datastructuur zoals Stack te gebruiken, maar we bespreken deze in dit hoofdstuk omdat het een interessante datastructuur is die bijvoorbeeld wordt gebruikt in Java Stack-geheugen.

Stack

Kort en bondig, hier volgt een overzicht van de methoden van de Stack-klasse:

Methoden

push(E element): voegt een element bovenop de stack toe.

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); } }

Toevoegen gebeurt op dezelfde manier als bij ArrayList, dus laten we direct naar deze methode kijken in combinatie met de pop()-methode:

pop(): verwijdert en retourneert het element van de bovenkant van de stack.

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); } }

Deze methode verwijdert één element van de bovenkant van de stack. Merk op dat de pop()-methode het laatst toegevoegde element uit de stack verwijdert. Dat is precies hoe het LIFO-principe werkt.

Het is ook mogelijk om te zien welk element zich bovenaan de stack bevindt:

peek(): retourneert het element van de bovenkant van de stack zonder het te verwijderen.

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); } }

Met deze methode wordt het bovenste element van de stack bekeken.

Gebruik

Beschouw een voorbeeld van het gebruik van de Stack datastructuur voor het navigeren tussen pagina's in een browser (die vooruit- en terug-pijlen die je vaak gebruikt).

Laten we de implementatie van de browsergeschiedenis plannen en methoden implementeren voor twee knoppen (goBack() en goForward()). Als je niet zeker weet over welke knoppen het gaat, bedoel ik deze navigatieknoppen:

Laten we een klasse implementeren die methoden bevat voor het bedienen van deze twee knoppen met behulp van de Stack datastructuur.

Werking

Er zijn twee stacks en een String-variabele. De eerste stack slaat de links op waarnaar we navigeren door op de "terug"-pijl te klikken. De tweede stack slaat de links op waarnaar je navigeert door op de "vooruit"-pijl te klikken. Daarnaast is er een String-variabele die de link van de huidige pagina opslaat.

In deze klasse zijn er vier methoden: visitPage(), goBack(), goForward() en getCurrentPage(). We behandelen ze stap voor stap.

De methode visitPage() zal doorsturen naar de URL die als parameter is opgegeven. Bij het navigeren naar een nieuwe pagina wordt de oude link toegevoegd aan de backStack. De forwardStack wordt geleegd wanneer je naar een nieuwe pagina gaat.

Bekijk de implementatie in de 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); } }

Op deze manier kunnen we terugkeren naar de vorige pagina bij het navigeren naar een nieuwe pagina.

Laten we de methode voor teruggaan implementeren. Deze werkt als volgt: we voegen de huidige link toe aan de forwardStack, vervolgens verwijderen we deze link uit de backStack en wijzen deze toe aan currentUrl.

Bekijk de implementatie in de 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."); } }

Ter herinnering: de methode pop() verwijdert het element van de bovenkant van de stack en geeft het terug. Met deze methode wijzen we dus direct de waarde van de URL toe aan de variabele currentUrl.

We controleren ook of de backStack niet leeg is; anders is het niet mogelijk om terug te gaan naar de vorige link (omdat deze er simpelweg niet is). Als de stack leeg is, tonen we een bijbehorende melding.

Op dezelfde manier implementeren we de methode voor het navigeren naar de volgende pagina. We wisselen eenvoudigweg de elementen in de stack om:

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."); } }

Nu rest alleen nog het implementeren van de methode getCurrentPage(), die eenvoudigweg de waarde van currentUrl retourneert.

Testen

Vervolgens testen we dit alles in de main-methode. We gebruiken de methode visitPage() drie keer om te controleren of deze links worden opgeslagen in de geschiedenis. Daarna gebruiken we de methode goBack() twee keer, gevolgd door de methode goForward() één keer, om de functionaliteit van de geschreven methoden te verifiëren.

Tijdens dit proces houden we onze status bij met behulp van de methode getCurrentPage(). Je kunt onderstaande code uitvoeren en ook proberen meer links toe te voegen en verschillende methoden te gebruiken om de functionaliteit van deze klasse te 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; } }

Onthoud dat de klasse Stack verouderd is en niet wordt aanbevolen voor gebruik in moderne Java-ontwikkeling. Gebruik in plaats daarvan liever Deque, wat een efficiënter alternatief is. In dit voorbeeld is Stack geïmplementeerd op basis van het LIFO-principe, en je kunt ook Deque implementeren, aangezien dit een dubbelzijdige wachtrij is die zowel het FIFO- als het LIFO-principe ondersteunt.

1. Wat is het belangrijkste principe van een Stack datastructuur?

2. Welke methode wordt gebruikt om een element bovenop de stack toe te voegen in Java?

3. Welke van de volgende Java-collecties wordt beschouwd als een modern alternatief voor Stack?

4. Wat retourneert de methode pop() van een Stack in Java?

question mark

Wat is het belangrijkste principe van een Stack datastructuur?

Select the correct answer

question mark

Welke methode wordt gebruikt om een element bovenop de stack toe te voegen in Java?

Select the correct answer

question mark

Welke van de volgende Java-collecties wordt beschouwd als een modern alternatief voor Stack?

Select the correct answer

question mark

Wat retourneert de methode pop() van een Stack in Java?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 2. Hoofdstuk 4
some-alt