A számítástechnikában a verem (stack) egy speciális adatszerkezet, amiben csak kétféle művelet van. A berak (push) egy elemet a verembe rak, a kivesz (pop) egy elemet elvesz a verem tetejéről. Mindig az utoljára betett elem vehető el, a verem többi része nem elérhető. Ezért is hívják LIFO adatszerkezetnek (Last In First Out). 7 6 5 4 3 2 1 356 0 123 Verem mutató 01 2 A kezeléséhez szükség van egy verem mutatóra. A veremmutató mutatja a veremben az első szabad helyet. Kezdetben 0. Ha egy elem a verembe kerül (push), akkor a verem mutató értéke növekszik. Ha egy elem kijön (pop), a verem mutató értéke csökken.
A megvalósítást szimuláljuk tömb segítségével. Ebben az esetben csak egyforma elemek kerülhetnek a verembe. BERAK(mit) Ha vmut=vmeret akkor nincs hely!!! egyébként verem[vmut]=mit : vmut=vmut+1; feltétel vége KIVESZ(mit) Ha vmut=0 akkor üres a verem egyébként vmut=vmut-1 : mit=verem[vmut] feltétel vége
Készíts Programot, ami beolvas egy c++ programot és ellenőrzi, hogy a zárójelezés rendben van-e Döntsd el egy stringben tárolt számról, hogy palindrom-e. (A feladatot veremmel kell megoldani.) Olvass be egy számot és egy számrendszert, váltsd át a számot az adott számrendszerbe és írd ki az eredményt helyiérték helyesen. (Használj vermet a megoldáshoz!)
Készítsen játékprogramot a veremkezelés szemléltetésére. A játékszabályok: Legyen egy 100 elemet befogadni képes verem. Induláskor töltsünk be 20 elemet. Egy-egy elem egy 1 és 10 közötti véletlen szám és a hozzá tartozó súly, amely szintén egy véletlen szám 1 és 5 között. A játék: tippelni kell a verem tetején lévő számra. Ha eltaláltuk, akkor annyi véletlen számmal tölti tovább a program a vermet, amennyi a kitalált szám és a hozzá tartozó súly szorzata. (A játékos nem ismeri a súlyozó tényezőket, sem a számokat) Ha nem találtuk ki a számot, akkor a verem tetején lévő szám törlődik, s az alatta lévő (következő) számra lehet tippelni. A játékos nyert, ha a verem megtelt. A nyeremény a veremben letárolt véletlen számok súlyokkal szorzott összege. A játékos vesztett, ha a verem kiürült. A verem tárolására egy 100 elemű egydimenziós tömböt fogunk használni. A tömb elemei rekordok.
Lengyel formula A szokásos matematikai formulákat nagyon nehéz kiértékelni. Pl. a*(b+c)/d^(x+y)*e A kifejezés azonban átírható úgy, hogy zárójelre nincs szükség és a kiértékelés is könnyű. A kapott alakot fordított lengyel formulának hívják, vagy röviden lengyel formulának. Nézzünk néhány példát: Szokásos a+b a b + Lengyel alak a+b*c a b c * + a*b^c+d a b c ^ * d + Ha operandust találunk akkor azt másoljuk a kimenetre. Ha műveletet, akkor a verem tetején levőt másoljuk ha nagyobb a prioritása, ha kisebb egyenlő akkor ez is megy a verembe.
Kicsit bonyolultabb a helyzet, ha a zárójelezést is kezelni akarjuk. Ha nyitót találunk, akkor az megy a verembe. Az operandusok és műveletek kezelése nem változik. Ha zárót találunk, akkor a veremből sorban a kimenetre másoljuk a jeleket a nyitó zárójelig. (Ez annak köszönhető, hogy a zárójelen belüli kifejezés egy önálló alak, lehetne rekurzív a megoldás ) Szokásos Lengyel alak a*(b+c) a b c + * (a+b)*c a b + c * a*b^(c+d)*e a b c d + ^ * e * A műveletek prioritása "("=0; + - =1; */ = 2; ^=3. Az üres verem 0;
A műveletek prioritása "("=0; + - =1; */ = 2; ^=3. Az üres verem 0; Szokásos a * b ^ ( c + d * e ) * f Lengyel alak Verem
CIKLUS AMÍG van elem a forrásban Következő elem beolvasása a forrásból X-be HA X egy operandus EREDMENY := EREDMENY + X HA X egy nyitó zárójel VEREMBE ( X ) HA X egy záró zárójel CIKLUS AMÍG a verem teteje nem nyitó zárójel KIVESZ VEREMBŐL Y-ba EREDMENY := EREDMENY + Y CVEGE KIVESZ VEREMBŐL Y-ba (nyitó zárójel) HA X egy műveleti jel CIKLUS AMÍG a verem tetején levő elem prioritása >= X prioritása KIVESZ VEREMBŐL Y-ba EREDMENY := EREDMENY + Y CVÉGE VEREMBE X CVÉGE CIKLUS AMÍG verem nem üres KIVESZ VEREMBŐL Y-ba EREDMENY := EREDMENY + Y CVÉGE
A kiértékelés már sokkal egyszerűbb. CIKLUS AMÍG van elem a forrásban Következő elem beolvasása a forrásból X-be HA X egy operandus verembe(x értéke) HA X egy műveleti jel veremből(e2) : veremből(e1) : verembe (E1 művelet E2) CVÉGE veremből(eredmény)