Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Pino-Tietorakenne Javassa | Osio
Javan Perustietorakenteet

Pino-Tietorakenne Javassa

Pyyhkäise näyttääksesi valikon

Stack on tietorakenne, joka noudattaa viimeksi sisään, ensimmäisenä ulos (LIFO) -periaatetta. Sama periaate koskee myös Deque-rakennetta, johon tutustuit aiemmin, ja Java-kehittäjät suosittelevat käyttämään Deque-rakennetta, kun tietorakenteen tulee toimia LIFO-periaatteella. Stack-tietorakenne on vanhentunut eikä sitä suositella käytettäväksi nykyaikaisessa Java-kehityksessä.

Jotkin kokoelmat ovat kuitenkin ei enää suositeltuja ja ne on merkitty vanhentuneiksi.

Vanhentunut

Kun elementti on merkitty vanhentuneeksi, se tarkoittaa, että kirjaston tai ohjelmointikielen tekijät neuvovat välttämään sen käyttöä uudessa koodissa ja suosittelevat uusien menetelmien, luokkien tai lähestymistapojen käyttöönottoa, jotka voivat tarjota turvallisempia, tehokkaampia tai toiminnallisempia ratkaisuja.

Esimerkkinä on Java-kielen Vector-luokka. Sen metodit on merkitty vanhentuneiksi, ja niiden sijaan suositellaan käytettäväksi nykyaikaisempia kokoelmia, kuten ArrayList ja LinkedList. Jos ohjelmoija käyttää edelleen Vector-luokan metodeja, kääntäjä voi antaa varoituksen siitä, että nämä metodit ovat vanhentuneita.

Esimerkki Javassa:

Main.java

Main.java

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

Tästä syystä ei suositella käyttämään tietorakennetta kuten Stack, mutta käsittelemme sitä tässä luvussa, koska se on mielenkiintoinen tietorakenne, jota käytetään esimerkiksi Javassa Stack-muisti.

Pino

Ytimekkäästi, tarkastellaan Stack-luokan metodeja:

Metodit

push(E element): lisää alkion pinon päälle.

Main.java

Main.java

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

Lisääminen tapahtuu samalla tavalla kuin ArrayList-rakenteessa, joten tarkastellaan suoraan tätä menetelmää yhdessä pop()-menetelmän kanssa:

pop(): poistaa ja palauttaa alkion pinon päältä.

Main.java

Main.java

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

Tämä menetelmä poistaa yhden alkion pinon päältä. Huomaa, että pop()-menetelmä poistaa viimeksi lisätyn alkion pinosta. Tämä on juuri se, miten LIFO-periaate toimii.

Voit myös tarkistaa, mikä alkio on pinon päällä:

peek(): palauttaa pinon päällimmäisen alkion ilman poistamista.

Main.java

Main.java

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

Tällä menetelmällä tarkastellaan pinon päällimmäistä alkiota.

Käyttö

Tarkastellaan esimerkkiä Stack-tietorakenteen käytöstä selaimen sivuhistorian hallinnassa (ne eteenpäin ja taaksepäin -nuolet, joita käytät usein).

Suunnitellaan selaushistorian toteutus ja toteutetaan kaksi painiketta vastaavat metodit (goBack() ja goForward()). Jos et ole varma, mistä painikkeista on kyse, tarkoitan näitä navigointipainikkeita:

Toteutetaan luokka, jossa on menetelmät näiden kahden painikkeen käyttämiseen hyödyntäen Stack-tietorakennetta.

Toimintaperiaate

Käytössä on kaksi pinoa ja String-muuttuja. Ensimmäinen pino tallentaa linkit, joihin siirrytään napsauttamalla "takaisin"-nuolta. Toinen pino tallentaa linkit, joihin siirrytään napsauttamalla "eteenpäin"-nuolta. Lisäksi on String-muuttuja, joka tallentaa nykyisen sivun linkin.

Tässä luokassa on neljä metodia: visitPage(), goBack(), goForward() ja getCurrentPage(). Käydään ne läpi vaiheittain.

visitPage()-metodi ohjaa meidät parametrina annettuun URL-osoitteeseen. Kun siirrytään uudelle sivulle, vanha linkki lisätään backStack-pinoon. forwardStack tyhjennetään aina, kun siirrytään uudelle sivulle.

Tarkastellaan toteutusta koodissa:

BrowserHistory.java

BrowserHistory.java

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

Näin voimme palata edelliselle sivulle siirryttäessä uudelle sivulle.

Toteutetaan takaisin-siirtymisen metodi. Se toimii seuraavasti: lisätään nykyinen linkki forwardStack-pinoon, sitten poistetaan tämä linkki backStack-pinosta ja asetetaan se currentUrl-muuttujaan.

Tarkastellaan toteutusta koodissa:

BrowserHistory.java

BrowserHistory.java

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

On hyvä muistaa, että pop()-metodi poistaa pinon päällimmäisen alkion ja palauttaa sen. Tämän vuoksi tällä metodilla voimme suoraan asettaa URL-osoitteen arvon muuttujaan currentUrl.

Tarkistamme myös, että backStack ei ole tyhjä; muuten emme voi palata edelliseen linkkiin (koska sitä ei ole olemassa). Jos pino on tyhjä, tulostetaan vastaava viesti.

Samalla tavalla toteutetaan metodi siirtymiseksi seuraavalle sivulle. Vaihdamme yksinkertaisesti pinon alkioiden järjestystä:

BrowserHistory.java

BrowserHistory.java

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

Nyt jäljellä on vain getCurrentPage()-menetelmän toteutus, joka yksinkertaisesti palauttaa currentUrl-arvon.

Testaus

Seuraavaksi testataan tätä kaikkea main-metodissa. Käytetään visitPage()-metodia kolme kertaa varmistaaksemme, että nämä linkit tallentuvat historiaan. Sen jälkeen käytetään goBack()-metodia kahdesti ja lopuksi goForward()-metodia kerran varmistaaksemme kirjoitettujen metodien toimivuuden.

Tämän prosessin aikana seurataan tilaa getCurrentPage()-metodilla. Voit suorittaa alla olevan koodin ja myös kokeilla lisätä lisää linkkejä ja käyttää eri metodeja testataksesi tämän luokan toiminnallisuutta:

Main.java

Main.java

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

Muista, että Stack-luokka on vanhentunut eikä sitä suositella käytettäväksi nykyaikaisessa Java-kehityksessä. Sen sijaan on parempi käyttää Deque-luokkaa, joka on tehokkaampi vaihtoehto. Tässä esimerkissä Stack on toteutettu LIFO-periaatteella, ja voit myös toteuttaa Deque-luokan, sillä se on kaksipäinen jono, joka tukee sekä FIFO- että LIFO-periaatteita.

1. Mikä on Stack-tietorakenteen perusperiaate?

2. Mikä menetelmä lisää alkion pinon (stack) huipulle Javassa?

3. Mikä seuraavista Javan kokoelmista on nykyaikaisempi vaihtoehto Stack-luokalle?

4. Mitä pop()-metodi palauttaa Java:n Stack-luokassa?

question mark

Mikä on Stack-tietorakenteen perusperiaate?

Valitse oikea vastaus

question mark

Mikä menetelmä lisää alkion pinon (stack) huipulle Javassa?

Valitse oikea vastaus

question mark

Mikä seuraavista Javan kokoelmista on nykyaikaisempi vaihtoehto Stack-luokalle?

Valitse oikea vastaus

question mark

Mitä pop()-metodi palauttaa Java:n Stack-luokassa?

Valitse oikea vastaus

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 11

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 11
some-alt