Pino (stack) Pino: viimeisenä sisään, ensimmäisenä ulos (LIFO, Last In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys pinon päälle (push), ja päällimmäisen alkion poisto (pop) Push(alkio) eli lisätään Push(alkio) eli lisätään eli poistetaan päällimmäinen alkio Push(alkio) eli lisätään Tietorakenteet, syksy 007 Pinon tarkempi määrittely Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Push(x): lisää n x pinon päälle : palauttaa pinon päällimmäisen alkion (ja poistaa sen pinosta) tapahtuu virhe, jos pino on tyhjä Muutamia pinon mahdollisia apumetodeja IsEmpty(): palauttaa arvon true, jos pino on tyhjä, ja muuten arvon false Tietorakenteet, syksy 007 Pinon tarkempi määrittely Top(): palauttaa pinon päällimmäisen alkion poistamatta sitä pinosta tapahtuu virhe, jos pino on tyhjä käytetään joskus myös nimeä Peek() Size(): palauttaa kokonaislukuarvon, joka kertoo kuinka monta alkiota pinossa on Esimerkki Top() palauttaa päällimmäisen alkion poistamatta sitä palauttaa (ja poistaa) päällimmäisen alkion pino on tyhjä virhe! 5 IsEmpty() palauttaa arvon true Size() palauttaa arvon Push(alkio5) lisää pinon päälle alkion 5 palauttaa ja poistaa päällimmäisen alkion IsEmpty() palauttaa arvon false Tietorakenteet, syksy 007 Tietorakenteet, syksy 007
Pinon rajapinta Javalla public interface Stack { public int size(); public boolean isempty(); public Object top() throws StackEmptyException; public void push (Object element); public Object pop() throws StackEmptyException; public class StackEmptyException extends RuntimeException { public StackEmptyException(String err) { super(err); Pinon taulukkototeutus Abstrakti määrittely ei ota kantaa toteutustapaan Perustapa: pinon alkiot talletetaan taulukkoon Taulukkototeutuksen osat: kokoa N oleva taulukko S muuttuja top, joka kertoo taulukon päällimmäisen alkion indeksin toteutustavan aiheuttama rajoitus: pinoon mahtuu korkeintaan N alkiota, missä N on taulukon koko Tietorakenteet, syksy 007 5 Tietorakenteet, syksy 007 6 Pinon taulukkototeutus Esim. pino taulukossa S, jonka koko on N = 0 pinossa alkiota alkio alkio alkio alkio top = Push(alkio5) lisää alkion 5 kohtaan top + alkio alkio alkio alkio alkio5 top = top + = ja arvoa top kasvatetaan yhdellä alkio alkio alkio alkio alkio5 Pinon taulukkototeutus tyhjä pino top = pino on täynnä alkio alkio alkio alkio alkio5 alkio6 alkio7 alkio8 alkio9 alkio0 top = 9 top = N, seuraava paikka N menisi taulukon rajojen yli nyt Push(x) tuottaisi virheen (ylivuoto) top = Tietorakenteet, syksy 007 7 Tietorakenteet, syksy 007 8
Pinon taulukkototeutus Javalla public class ArrayStack implements Stack { public static final int defaultn = 000; private int N; private Object S[]; private int top = -; public ArrayStack() { this(defaultn); public ArrayStack(int size) { N = size; S = new Object[N]; Pinon taulukkototeutus Javalla public int size() { return (top + ); public boolean isempty() { return (top < 0); public void push(object obj) { if (size() == N) throw new StackFullException("Stack overflow."); S[++top] = obj; Tietorakenteet, syksy 007 9 Tietorakenteet, syksy 007 0 Pinon taulukkototeutus Javalla public Object top() throws StackEmptyException { throw new StackEmptyException("Stack is empty."); return S[top]; public Object pop() throws StackEmptyException { Object elem; throw new StackEmptyException("Stack is Empty."); elem = S[top]; S[top--] = null; return elem; Tietorakenteet, syksy 007 Jono (queue) Jono: ensimmäisenä sisään, ensimmäisenä ulos (FIFO, First In, First Out) -tietorakenne kaksi perusoperaatiota: alkion lisäys jonon perälle (enqueue), ja jonon ensimmäisen alkion poisto (dequeue) alkio alkio alkio alkio alkio alkio alkio alkio alkio Enqueue(alkio) Enqueue(alkio) Dequeue() Dequeue() Tietorakenteet, syksy 007
Jonon tarkempi määrittely Jono Q on abstrakti tietotyyppi, jolla on ainakin perusmetodit: Enqueue(x): lisää n x jonon perälle Dequeue(): palauttaa jonon ensimmäisen alkion (ja poistaa sen jonosta) tapahtuu virhe, jos jono on tyhjä Jonon tarkempi määrittely Front(): palauttaa jonon ensimmäisen alkion poistamatta sitä jonosta tapahtuu virhe, jos jono on tyhjä Size(): palauttaa kokonaislukuarvon, joka kertoo kuinka monta alkiota jonossa on Vastaavat apumetodit kuin pinolla IsEmpty(): palauttaa arvon true, jos jono on tyhjä, ja muuten arvon false Tietorakenteet, syksy 007 Tietorakenteet, syksy 007 Esimerkki Front() aiheuttaa virheen Enqueue(alkio) lisää alkion alkio Size() palauttaa arvon alkio Enqueue(alkio) lisää alkion alkio alkio IsEpmty() palauttaa arvon false alkio alkio Front() palauttaa alkion poistamatta sitä alkio alkio Enqueue(alkio) lisää alkion alkio alkio alkio Dequeue() palauttaa ja poistaa alkion alkio alkio Jonon rajapinta Javalla public interface Queue { public int size(); public boolean isempty(); public Object front() throws QueueEmptyException; public void enqueue (Object element); public Object dequeue() throws QueueEmptyException; public class QueueEmptyException extends RuntimeException { public QueueEmptyException(String err) { super(err); Tietorakenteet, syksy 007 5 Tietorakenteet, syksy 007 6
Jonon taulukkototeutus Jonon taulukkototeutuksen osat: kokoa N oleva taulukko Q muuttuja f irst, joka kertoo jonon ensimmäisen alkion paikan taulukossa jos jono on tyhjä, first kertoo mihin ensimmäinen alkio asetetaan muuttuja rear, joka kertoo seuraavan taulukossa vapaana olevan alkion indeksin Jonon taulukkototeutus Esim. jono taulukossa Q, jonka koko on N = 0 jonossa 5 alkiota alkio alkio alkio alkio alkio5 first = 0 rear = 5 Dequeue palauttaa ja poistaa alkion alkio alkio alkio alkio5 first = 0 rear = 5 ja arvoa first kasvatetaan yhdellä alkio alkio alkio alkio5 first = rear = 5 Tietorakenteet, syksy 007 7 Tietorakenteet, syksy 007 8 Jonon taulukkototeutus alkutilanne alkio8 alkio9 first = 7 rear = 9 Enqueue(alkio0) lisää alkion 0 kohtaan 9 alkio8 alkio9 alkio0 first = 7 rear = 9 arvoa rear kasvatetaan yhdellä alkio8 alkio9 alkio0 rear = (rear + )%N = 0%0 = 0 first = 7 Jonon taulukkototeutus lähtötilanne alkio alkio alkio alkio5 alkio6 alkio7 alkio8 alkio9 alkio0 rear = first = Enqueue(alkio) lisäsi alkion kohtaan alkio alkio alkio alkio alkio5 alkio6 alkio7 alkio8 alkio9 alkio0 first = rear = ongelma, jos jonon tyhjyys tutkitaan ehdon first == rear pohjalta (a la luentomoniste) Tietorakenteet, syksy 007 9 Tietorakenteet, syksy 007 0
Jonon taulukkototeutus ratkaisu : sallitaan vain N alkiota (a la luentomoniste) ratkaisu : ylläpidetään erikseen tieto alkioiden lukumäärästä (nämä kalvot) jonon alkioiden lukumäärä ratkaisussa : jos alkioita vähemmän kuin N, niin alkioiden lkm = (rear + N first)%n aaa a9 a0aaa rear = first = 8 rear + N = + 0 = Jonon taulukkototeutus Javalla public class ArrayQueue implements Queue { public static final int defaultn = 000; private int N; private Object Q[]; private int first = 0; private int rear = 0; private int items = 0; public ArrayQueue() { this(defaultn); public ArrayQueue(int size) { N = size; Q = new Object[N]; Tietorakenteet, syksy 007 Tietorakenteet, syksy 007 Jonon taulukkototeutus Javalla public int size() { return items; public boolean isempty() { return (items == 0); public void enqueue(object obj) { if (size() == N) throw new QueueFullException("Queue overflow."); Q[rear] = obj; rear = (rear+) % N; items++; Tietorakenteet, syksy 007 Jonon taulukkototeutus Javalla public Object front() throws QueueEmptyException { throw new QueueEmptyException("Queue is empty."); return Q[front]; public Object dequeue() throws QueueEmptyException { Object elem; throw new QueueEmptyException("Queue is Empty."); elem = Q[front]; Q[front] = null; front = (front+) % N; items--; return elem; Tietorakenteet, syksy 007
Loppuhuomautuksia Sekä pinon että jonon taulukkototeutuksen tilavaatimus on Θ(N) muuttumaton, eikä riipu alkioiden lukumäärästä n jos N suuri arvoon n nähden, suuri osa taulukon muistitilasta käyttämättä jos N liian pieni, tila voi loppua kesken Kukin tässä käsitelty perus- sekä apumetodi omaa suoritusajan Θ() Tietorakenteet, syksy 007 5