(K) Pinototeutuksen muuttaminen¶
Tavoite: Ymmärrän olio-ohjelmoinnissa käytetyn jaottelun luokan määrittelyn ja luokan toteutuksen välillä. Ymmärrän myös, miten tämä jaottelu vaikuttaa muutosten tekemiseen koodissa.
Tämä harjoitus on pohjana modulaarisuudelle, jota käsitellään myöhemmin.
Ohjeita: Tarkastellaan linkitetyn listan erikoistapausta: pinoa. Pinolla tarkoitetaan sellaista tietorakennetta, jossa alkioita pystyy lisäämään pinon päällimmäiseksi (alkuun) ja poistamaan pinon päältä (alusta). Linkitetyssä listassahan alkioita pystyy lisäämään mihin kohtaan tahansa ja poistamaan mistä kohdasta tahansa.
Edellä ollut korttien siirtelytehtäväkin muistutti pinoa, mutta siinä oli edellä mainittujen pinon perusoperaatioiden lisäksi muitakin mahdollisuuksia pinon sisällön muuttamiseen.
Erityisesti pino voitaisiin helposti toteuttaa myös taulukkona (tai vektorina). Tällöin, pinon pohjimmainen alkio olisi indeksissä 0, ja lisäksi tarvittaisiin indeksimuuttuja kertomaan, mistä indeksistä löytyy pinon päällimmäinen alkio.
Ainoa ero näiden kahden toteutuksen välillä on se, että linkitettynä listana pino voi kasvaa rajatta (ellei muisti lopu), mutta taulukkototeuksessa taulukolle (pinolle) pitää asettaa jokin maksimikoko. Tähän eroon ei tarvitse kiinnittää huomiota alla olevissa kysymyksissä.
Tarkastele korttien siirtelytehtävän kolmea tiedostoa:
cards.hh
, cards.cpp
ja main.cpp
,
ja yritä miettiä, mitkä muutokset ovat tarpeellisia, jos pinon toteutus
muutetaan linkitetystä listasta taulukoksi.
Rajoitutaan kuitenkin vain pinon perusoperaatioihin eli
metodeihin add
ja remove
.
Myös metodia print_from_top_to_bottom
voi pitää pino-operaationa.