// Liitetään pakkaukseen. package pino; /* * Olio-ohjelmoinnin perusteet I. * * Pino-rajapinnan toteutus kokonaisuudessaan konkreettisessa luokassa. * * Alkion tyyppi on parametrisoitu. * * Pinon koolle asetetaan yläraja. Null-arvot sallitaan. * * Tietorakenteeksi on valittu LinkedList, koska se on tuttu ja toteuttaa * tehokkaasti Deque-rajapinnan pinossa käytetyksi tarkoitetut metodit. * * Jorma Laurikkala (jorma.laurikkala@tuni.fi). * * Viimeksi muutettu 18.2.2020. * */ // Otetaan käyttöön javan linkitetty lista. import java.util.LinkedList; // Iterable-rajapinnan metodin korvauksen vuoksi. import java.util.Iterator; public class LinkitettyPino extends AbstraktiPino { /* * Attribuutit. * */ // Tietorakenne alkioiden tallentamiseen. Listan tietoalkion tyyppiparametrina // käytetään pinon tyyppiparametria. private LinkedList alkiot; /* * Rakentajat. * */ public LinkitettyPino(int m) { super(m); alkiot = new LinkedList(); } /* * Aksessorit. * */ // Tarvitaan, jotta pinon aksessori voi edetä. protected LinkedList alkiot() { return alkiot; } /* * Pinon operaatioiden kunnollinen korvaus. * */ /* * Lisää alkion o pinon päälle, mikäli pinoon mahtuu vielä * uusi alkio. Paluuarvo on false, jos pino on täynnä. */ public boolean lisää(E o) { if (koko() < maxKoko()) { // Listan alku vastaa pinon päällystä. alkiot.push(o); return true; } else { return false; } } /* * Palauttaa ja poistaa pinon päällimmäisen alkion, mikäli pinossa * on alkioita. Paluuarvo on null, jos pino on tyhjä. */ public E poista() { // Listan alku vastaa pinon päällystä. if (!onkoTyhjä()) { return alkiot.pop(); } else { return null; } } /* * Palauttaa alkioiden lukumäärän (>= 0) pinossa. */ public int koko() { return alkiot.size(); } /* * Palauttaa totuusarvon true, jos pino on tyhjä ja totuusarvon false, * jos pinossa on ainakin yksi alkio. */ public boolean onkoTyhjä() { return alkiot.isEmpty(); } /* * Palauttaa pinon päällimmäisen alkion sitä poistamatta, * mikäli pino ei ole tyhjä. Paluuarvo on null, jos pino on tyhjä. */ public E ylin() { // Listan alku vastaa pinon päällystä. return alkiot.peek(); } /* * Iterable-korvaus. * */ /* Luo pinolle iteraattorin ja palauttaa viitteen siihen. */ @Override public Iterator iterator() { // Luodaan iteraattori tälle pinolle. return new LinkitettyPinoIteraattori(this); } }