Az elmúlt alkalommal megismertük a lista szerkezetét. Láttuk, hogy ez nagyon nagy mértékben egyszerusíti az adattárolást. Hátránya a sebessége.
A verem a listához hasonló adatszerkezet. Itt is láncoltan ábrázoljuk az adatokat, de egy kicsit másképpen. Képzeljük el hogy a valóságban hogy néz ki a verem. A lényege az, hogy ha valamit belerakunk, akkor az csak akkor tudjuk kivenni, ha mindent kivettünk felole.
Az objektumunk is mindig ezt fogja csinálni. A veremhez mindig hozzá tudunk rakni, de kivenni, csak a legutoljára bele rakott elemet lehet.
Nézzük az objektumunk deklarációját
Típus Tmutató = ^TVerem Tverem = rekord Érték: Telem mutató: TMutató rekord vége Verem =Objektum Privát teteje: TMutato hiba: boolean Publikus eljárás ures függvény ures_e: logikai fügvény hibas_e: logikai függvény tele_e: logikai eljárás verembol (var e:Telem) eljárás verembe (e: Telem) eljárás teto(var tet:Telem) objektum végeItt is a szokásos mutató típusokat deklaráljuk. Szerintem ha az elozo fejezeteket értettük akkor ez sem fog különösebb gondot okozni. Az egetlen különbség hogy itt nem kell fejet deklarálni, hiszen a teto lesz automatikusan a fej. A Telemet itt is egy másik unitba célszeru deklarálni.
Nézzük meg az egyes eljárások specifikációját:
Ures: Ez az eljárás kiüríti
a vermet.
Üres_e: visszatérési
érték igaz, ha a verem üres.
Hibas: Megmondja, hogy valamelyik eljárás
meghívásakor volt e hiba.
Tele_e: Igaz értékkel tér
vissza, ha a memóriában már nincs több hely.
Verembol: Ez az eljárás
a verem tetején lévo elemmel tér vissza, és ki is
veszi azt. Az eljárás végén a mutató a következo
elemre fog mutatni.
Verembe: Értelemszeruen hozzárak
egy elemet a verem tetejéhez. Az eljárás után az
aktuális elem az új elem lesz.
Teto: a verem tetején levo elem
értékével tér vissza, de nem veszi ki azt!
No akkor nézzük meg egyesével az algoritmusokat.
Eljárás verem.üres Teteje := nil Hiba := hamis Eljárás végeEz az eljárás ugyanaz mint a listánál. Az elso elemet (a tetot) nilre állítjuk, és a hibát is hamisra állítjuk.
Függvény verem.ures_e: logikai Ures_e:=(teteje = nil) Függvény vége Függvény verem.hibás_e logikai Hibas_e:= hiba Hiba := hamis Függvény vége Függvény verem.tele_e: logikai Tele_e := (maxavail= sizeof(telem)) Függvény végeEz az elozo 3 függvény szintén a listáéval azonos. Szerintem sok hozzáfuzni való nincs.
Eljárás verem.verembol(változó e: telem) Változó segéd: Tmutató Ha ürese_e akkor hiba := igaz Különben e := teteje^.ertek segéd := teteje^.mutato dispose(teteje) teteje := seged elágazás vége elágazás vége eljárás végeEbben az eljárásban kiolvasom a legelso elemet. Ez ugye a teto. Miután ezt megtettem, egy segéd változóban tárolom a rákövetkezo elemet. Így fel tudom szabadítani a teto elemet. Ezután a tetot segédre állítom.
Eljárás verem.verembe(e: telem) Változó új: tmutató Ha tele_e akkor hiba := igaz Különben Lefoglal(új) Uj^.mutató := teteje Új^.’érték := e Teteje := új Elágazás vége Elágazás vége Eljárás végeEz se olyan nehéz eljárás. Itt lefoglalunk egy új elemet Ez az új elem a tetore fog mutatni. Majd a teto lesz az új elem.
Eljárás teto(változó tet: telem) Ha ürese akkor hiba:= igaz Különben Tet := teteje^.ertek Elágazás vége Eljárás végeSzerintem a verem nem egy túl nehéz objektum, ugyanakkor majdnem olyan jól használható mint a lista. De ha végiggondoljuk logikusan, tulajdonképpen a verem nem más mint a lista egy (nagyon) speciális esete. Következo leckében megtanuljuk kezelni a sorokat is, és ha minden jól megy fel fog kerülni egy leírás ami egy két példát fog ismertetni.