Stakkdatastruktur i Java
En Stack er en datastruktur som følger Last In, First Out (LIFO)-prinsippet. Det samme prinsippet gjelder for en Deque, som du har lært om tidligere, og Java-utviklere anbefaler å bruke en Deque når en datastruktur må operere etter LIFO-prinsippet. Datastrukturen Stack er utdatert og anbefales ikke i moderne Java-utvikling.
Noen samlinger er ikke lenger anbefalt og har blitt avskrevet.
Avskrevet
Når et element er merket som avskrevet, betyr det at forfatterne av biblioteket eller programmeringsspråket anbefaler å unngå bruk i ny kode og foreslår å ta i bruk nye metoder, klasser eller tilnærminger som kan gi tryggere, mer effektive eller mer funksjonelle løsninger.
Et eksempel er Vector-klassen i Java. Metodene dens er blitt foreldet til fordel for mer moderne samlinger som ArrayList og LinkedList. Hvis en programmerer fortsatt bruker Vector-metoder, kan kompilatoren gi en advarsel om at disse metodene er foreldet.
Eksempel i 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)); } }
Derfor er det ikke anbefalt å bruke en datastruktur som Stack, men vi vil diskutere den i dette kapittelet fordi det er en interessant datastruktur som for eksempel brukes i Java Stack-minne.
Stakk
Rett på sak, la oss se på metodene i Stack-klassen:
Metoder
push(E element): legger til et element øverst i stakken.
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); } }
Legging til gjøres på samme måte som i ArrayList, så la oss umiddelbart se på denne metoden i kombinasjon med pop()-metoden:
pop(): fjerner og returnerer elementet fra toppen av stakken.
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); } }
Denne metoden fjerner ett element fra toppen av stakken. Merk at pop()-metoden fjerner det sist lagte elementet fra stakken. Det er akkurat slik LIFO-prinsippet fungerer.
Du kan også se hvilket element som ligger øverst i stakken:
peek(): returnerer elementet fra toppen av stakken uten å fjerne det.
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); } }
Med denne metoden ser vi på det øverste elementet i stakken.
Bruk
La oss se på et eksempel på bruk av datastrukturen Stack for å navigere mellom sider i en nettleser (de fremover og bakover pilene du ofte bruker).
La oss planlegge implementeringen av nettleserhistorikken og implementere metoder for to knapper (goBack() og goForward()).
Hvis du ikke er sikker på hvilke knapper jeg refererer til, mener jeg disse navigasjonsknappene:
La oss implementere en klasse som har metoder for å operere disse to knappene ved bruk av datastrukturen Stack.
Hvordan det vil fungere
Du vil ha to stacker og en String-variabel. Den første stacken vil lagre lenkene vi navigerer til ved å klikke på "tilbake"-pilen. Den andre stacken vil lagre lenkene du navigerer til ved å klikke på "fremover"-pilen. Du vil også ha en String-variabel som lagrer lenken til den nåværende siden.
I denne klassen vil det være fire metoder: visitPage(), goBack(), goForward() og getCurrentPage(). La oss gå gjennom dem steg for steg.
Metoden visitPage() vil omdirigere oss til URL-en som er spesifisert i parameteren. Når du går til en ny side, vil den gamle lenken bli lagt til i backStack. forwardStack vil bli tømt når du går til en ny side.
La oss se på implementeringen i koden:
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); } }
På denne måten kan vi gå tilbake til forrige side når vi navigerer til en ny side.
La oss implementere metoden for å gå tilbake. Den vil fungere slik: vi legger til den nåværende lenken i forwardStack, deretter fjerner vi denne lenken fra backStack, og tilordner den til currentUrl.
La oss se på implementeringen i koden:
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."); } }
Jeg minner om at metoden pop() fjerner elementet fra toppen av stakken og returnerer det. Dermed tildeles verdien til URL-en direkte til variabelen currentUrl ved bruk av denne metoden.
Vi kontrollerer også at backStack ikke er tom; ellers vil det ikke være mulig å gå tilbake til forrige lenke (rett og slett fordi den ikke finnes). Hvis stakken er tom, vises en tilsvarende melding.
På samme måte implementeres metoden for å navigere til fremover-siden. Vi bytter ganske enkelt elementene i stakken:
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."); } }
Nå gjenstår det bare å implementere metoden getCurrentPage(), som enkelt returnerer verdien til currentUrl.
Testing
Deretter skal vi teste alt dette i main-metoden. Vi bruker metoden visitPage() tre ganger for å sikre at disse lenkene lagres i historikken. Deretter bruker vi metoden goBack() to ganger, etterfulgt av metoden goForward() én gang, for å verifisere funksjonaliteten til de skrevne metodene.
I løpet av denne prosessen følger vi med på tilstanden vår ved hjelp av metoden getCurrentPage(). Du kan kjøre koden under og også prøve å legge inn flere lenker og bruke ulike metoder for å teste funksjonaliteten til denne klassen:
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; } }
Husk at klassen Stack er utdatert og anbefales ikke for bruk i moderne Java-utvikling. Det er bedre å bruke Deque, som er et mer effektivt alternativ. I dette eksempelet er Stack implementert basert på LIFO-prinsippet, og du kan også implementere Deque, siden det er en dobbelt-endt kø som støtter både FIFO- og LIFO-prinsipper.
1. Hva er det primære prinsippet for en Stack datastruktur?
2. Hva er metoden som brukes for å legge til et element øverst i stakken i Java?
3. Hvilken av følgende Java-samlinger regnes som et mer moderne alternativ til Stack?
4. Hva vil pop()-metoden til en Stack returnere i Java?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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?
Fantastisk!
Completion rate forbedret til 4
Stakkdatastruktur i Java
Sveip for å vise menyen
En Stack er en datastruktur som følger Last In, First Out (LIFO)-prinsippet. Det samme prinsippet gjelder for en Deque, som du har lært om tidligere, og Java-utviklere anbefaler å bruke en Deque når en datastruktur må operere etter LIFO-prinsippet. Datastrukturen Stack er utdatert og anbefales ikke i moderne Java-utvikling.
Noen samlinger er ikke lenger anbefalt og har blitt avskrevet.
Avskrevet
Når et element er merket som avskrevet, betyr det at forfatterne av biblioteket eller programmeringsspråket anbefaler å unngå bruk i ny kode og foreslår å ta i bruk nye metoder, klasser eller tilnærminger som kan gi tryggere, mer effektive eller mer funksjonelle løsninger.
Et eksempel er Vector-klassen i Java. Metodene dens er blitt foreldet til fordel for mer moderne samlinger som ArrayList og LinkedList. Hvis en programmerer fortsatt bruker Vector-metoder, kan kompilatoren gi en advarsel om at disse metodene er foreldet.
Eksempel i 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)); } }
Derfor er det ikke anbefalt å bruke en datastruktur som Stack, men vi vil diskutere den i dette kapittelet fordi det er en interessant datastruktur som for eksempel brukes i Java Stack-minne.
Stakk
Rett på sak, la oss se på metodene i Stack-klassen:
Metoder
push(E element): legger til et element øverst i stakken.
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); } }
Legging til gjøres på samme måte som i ArrayList, så la oss umiddelbart se på denne metoden i kombinasjon med pop()-metoden:
pop(): fjerner og returnerer elementet fra toppen av stakken.
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); } }
Denne metoden fjerner ett element fra toppen av stakken. Merk at pop()-metoden fjerner det sist lagte elementet fra stakken. Det er akkurat slik LIFO-prinsippet fungerer.
Du kan også se hvilket element som ligger øverst i stakken:
peek(): returnerer elementet fra toppen av stakken uten å fjerne det.
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); } }
Med denne metoden ser vi på det øverste elementet i stakken.
Bruk
La oss se på et eksempel på bruk av datastrukturen Stack for å navigere mellom sider i en nettleser (de fremover og bakover pilene du ofte bruker).
La oss planlegge implementeringen av nettleserhistorikken og implementere metoder for to knapper (goBack() og goForward()).
Hvis du ikke er sikker på hvilke knapper jeg refererer til, mener jeg disse navigasjonsknappene:
La oss implementere en klasse som har metoder for å operere disse to knappene ved bruk av datastrukturen Stack.
Hvordan det vil fungere
Du vil ha to stacker og en String-variabel. Den første stacken vil lagre lenkene vi navigerer til ved å klikke på "tilbake"-pilen. Den andre stacken vil lagre lenkene du navigerer til ved å klikke på "fremover"-pilen. Du vil også ha en String-variabel som lagrer lenken til den nåværende siden.
I denne klassen vil det være fire metoder: visitPage(), goBack(), goForward() og getCurrentPage(). La oss gå gjennom dem steg for steg.
Metoden visitPage() vil omdirigere oss til URL-en som er spesifisert i parameteren. Når du går til en ny side, vil den gamle lenken bli lagt til i backStack. forwardStack vil bli tømt når du går til en ny side.
La oss se på implementeringen i koden:
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); } }
På denne måten kan vi gå tilbake til forrige side når vi navigerer til en ny side.
La oss implementere metoden for å gå tilbake. Den vil fungere slik: vi legger til den nåværende lenken i forwardStack, deretter fjerner vi denne lenken fra backStack, og tilordner den til currentUrl.
La oss se på implementeringen i koden:
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."); } }
Jeg minner om at metoden pop() fjerner elementet fra toppen av stakken og returnerer det. Dermed tildeles verdien til URL-en direkte til variabelen currentUrl ved bruk av denne metoden.
Vi kontrollerer også at backStack ikke er tom; ellers vil det ikke være mulig å gå tilbake til forrige lenke (rett og slett fordi den ikke finnes). Hvis stakken er tom, vises en tilsvarende melding.
På samme måte implementeres metoden for å navigere til fremover-siden. Vi bytter ganske enkelt elementene i stakken:
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."); } }
Nå gjenstår det bare å implementere metoden getCurrentPage(), som enkelt returnerer verdien til currentUrl.
Testing
Deretter skal vi teste alt dette i main-metoden. Vi bruker metoden visitPage() tre ganger for å sikre at disse lenkene lagres i historikken. Deretter bruker vi metoden goBack() to ganger, etterfulgt av metoden goForward() én gang, for å verifisere funksjonaliteten til de skrevne metodene.
I løpet av denne prosessen følger vi med på tilstanden vår ved hjelp av metoden getCurrentPage(). Du kan kjøre koden under og også prøve å legge inn flere lenker og bruke ulike metoder for å teste funksjonaliteten til denne klassen:
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; } }
Husk at klassen Stack er utdatert og anbefales ikke for bruk i moderne Java-utvikling. Det er bedre å bruke Deque, som er et mer effektivt alternativ. I dette eksempelet er Stack implementert basert på LIFO-prinsippet, og du kan også implementere Deque, siden det er en dobbelt-endt kø som støtter både FIFO- og LIFO-prinsipper.
1. Hva er det primære prinsippet for en Stack datastruktur?
2. Hva er metoden som brukes for å legge til et element øverst i stakken i Java?
3. Hvilken av følgende Java-samlinger regnes som et mer moderne alternativ til Stack?
4. Hva vil pop()-metoden til en Stack returnere i Java?
Takk for tilbakemeldingene dine!