Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Stakkdatastruktur i Java | Avanserte Datastrukturer i Java
Java Datastrukturer

bookStakkdatastruktur 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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?

question mark

Hva er det primære prinsippet for en Stack datastruktur?

Select the correct answer

question mark

Hva er metoden som brukes for å legge til et element øverst i stakken i Java?

Select the correct answer

question mark

Hvilken av følgende Java-samlinger regnes som et mer moderne alternativ til Stack?

Select the correct answer

question mark

Hva vil pop()-metoden til en Stack returnere i Java?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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?

bookStakkdatastruktur 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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?

question mark

Hva er det primære prinsippet for en Stack datastruktur?

Select the correct answer

question mark

Hva er metoden som brukes for å legge til et element øverst i stakken i Java?

Select the correct answer

question mark

Hvilken av følgende Java-samlinger regnes som et mer moderne alternativ til Stack?

Select the correct answer

question mark

Hva vil pop()-metoden til en Stack returnere i Java?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 4
some-alt