Verem

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ége
Itt 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ége
Ez 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ége
 
Ez 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ége
Ebben 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ége
Ez 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ége
Szerintem 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.