Stackdatastructuur 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 is 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 veiliger, efficiënter of functioneler zijn.
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
12345678910111213141516package 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 krachtig, laten we de methoden van de Stack-klasse bekijken:
Methoden
push(E element): voegt een element bovenop de stack toe.
Main.java
123456789101112package 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
1234567891011121314package 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. Let op dat de pop()-methode het laatst toegevoegde element uit de stack verwijdert. Dat is precies hoe het LIFO-principe werkt.
Je kunt ook zien welk element zich bovenaan de stack bevindt:
peek(): retourneert het element van de bovenkant van de stack zonder het te verwijderen.
Main.java
123456789101112131415package 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 bekijken we het bovenste element van de stack.
Gebruik
Laten we een voorbeeld bekijken van het gebruik van de Stack datastructuur voor het navigeren tussen pagina's in een browser (die vooruit en achteruit 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 ik het heb, bedoel ik deze navigatieknoppen:
Implementeer een klasse met methoden 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 genavigeerd wordt via de "terug"-pijl. De tweede stack slaat de links op waarnaar genavigeerd wordt via de "vooruit"-pijl. Daarnaast is er een String-variabele die de link van de huidige pagina bewaart.
Deze klasse bevat vier methoden: visitPage(), goBack(), goForward() en getCurrentPage(). Deze worden stap voor stap besproken.
De methode visitPage() leidt door naar de URL die als parameter wordt opgegeven. Bij het openen van een nieuwe pagina wordt de oude link toegevoegd aan de backStack. De forwardStack wordt geleegd bij het openen van een nieuwe pagina.
Bekijk de implementatie in de code:
BrowserHistory.java
1234567891011121314151617181920212223242526import 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 is het mogelijk om terug te keren naar de vorige pagina bij het navigeren naar een nieuwe pagina.
Implementeer nu de methode voor teruggaan. Deze werkt als volgt: de huidige link wordt toegevoegd aan de forwardStack, vervolgens wordt deze link verwijderd uit de backStack en toegekend aan currentUrl.
Bekijk de implementatie in de code:
BrowserHistory.java
12345678910public 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
12345678910public 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778package 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. Wat is de methode die 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?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.