Verem (adatszerkezet): LIFO működés, push/pop műveletek és példák
Verem (adatszerkezet, LIFO): érthető magyarázat push/pop műveletekkel, gyakorlati példákkal és kódokkal — tanuld meg a verem működését gyorsan!
A verem az egyik legfontosabb adatszerkezet a számítástechnikában. Ahhoz, hogy megértsük, hogyan működik a verem, gondoljunk egy képpel: egy lefelé fordított kártyapaklira. Csak a tetején lévő kártyához férhetünk hozzá könnyedén. Ha meg akarjuk nézni a legfelső kártyát, két dolgot tehetünk: megkukkantjuk, de a pakliban hagyjuk (ez a "peek" vagy "top" művelet), vagy leemeljük (ez a "pop"). Amikor leemeljük a legfelső tárgyat, akkor eltávolítjuk a veremről. Ha egy másik kártyát akarunk a verem tetejére tenni, akkor betesszük (ez a "push").
A veremet last-in-first-out (LIFO) gyűjteménynek nevezzük. Ez azt jelenti, hogy az utolsó dolog, amit hozzáadtunk (push), az lesz az első dolog, amit eltávolítunk (pop). Például, ha az utolsó kártya, amit a kártyakupacra tettünk, egy ász volt, akkor az első kártya, amit a tetejéről lehúzunk, ugyanez az ász.
Alapműveletek
- push(x) — elem elhelyezése a verem tetején.
- pop() — a verem tetejéről eltávolítja és visszaadja az elemet; ha a verem üres, akkor alulcsordulás (underflow) történhet.
- peek()/top() — visszaadja, de nem távolítja el a csúcs elemet; hasznos a gyors ellenőrzéshez.
- isEmpty() — megmondja, hogy a verem üres-e.
- size() — visszaadja a veremben lévő elemek számát.
Megvalósítás és komplexitás
Verem megvalósítható többféle módon, például tömb (array) vagy láncolt lista (linked list) segítségével. A gyakorlati programozásban gyakran használják a dinamikus tömböket (pl. Python list, Java ArrayDeque) mivel egyszerű használni.
- Push és pop műveletek tipikusan O(1) időben hajthatók végre (amortizált O(1) dinamikus tömb esetén).
- A memóriaigény lineáris a veremben tárolt elemek számával: O(n).
- Fontos állapotok: overflow (ha fix méretű tömbből nincs több hely) és underflow (pop üres veremből).
Példák és alkalmazások
Konkrét felhasználási területek:
- Függvényhívások kezelése — a megvalósító (runtime) veremként használja a hívási veremet (call stack) a visszatérési címek és helyi változók tárolására.
- Visszavonás (undo) funkciók — az előző állapotok verembe kerülnek, így visszalépéskor popolhatók.
- Kifejezések kiértékelése és konverziója — infix → postfix (RPN) átalakítás és kiértékelés verem segítségével hatékony.
- Grafok mélységi bejárása (DFS) — rekurzió helyett expliciten használt veremmel is megvalósítható.
Egyszerű pseudokód
Példa tömbalapú verem kezelésére, ahol top a csúcs indexe (kezdő érték: -1):
push(stack, x): top = top + 1 stack[top] = x pop(stack): if top == -1: error "underflow" x = stack[top] top = top - 1 return x peek(stack): if top == -1: error "empty" return stack[top]
Gyakorlati példa (lépésről lépésre)
Tegyük fel, a verembe sorrendben beteszünk: 5, majd 10, majd 3.
- push(5) → verem (alulról felfelé): [5]
- push(10) → [5, 10]
- push(3) → [5, 10, 3]
- pop() → visszaad 3, verem most: [5, 10]
- peek() → visszaad 10, verem változatlan: [5, 10]
Tippek és jó gyakorlatok
- Használj beépített, jól tesztelt könyvtári adatstruktúrákat (pl. stack jellegű API-k), ha elérhetők.
- Védj a túltöltés és kiürítés ellen: előtte ellenőrizd az isEmpty/isFull állapotot, vagy kezeld a kivételeket.
- Ha teljesítménykritikus a feladat, gondold át tömb vs. láncolt lista megoldás előnyeit: tömb jobb cache-lokalitást ad, láncolt lista rugalmasabb méretkezelést.
Összefoglalva: a verem egyszerű, de rendkívül hasznos adatszerkezet, amely a LIFO elvre épül és számos algoritmus és rendszer alapvető alkotóeleme.

Két művelet a veremben: push és pop.
Történelem
A halmot először 1955-ben javasolta, majd 1957-ben szabadalmaztatta a német Friedrich L. Bauer. Ugyanezt a koncepciót az ausztrál Charles Leonard Hamblin ettől függetlenül, nagyjából ugyanebben az időben fejlesztette ki.
Egyéb műveletek
A modern számítógépes nyelvekben a verem általában a "push"-nál és a "pop"-nál több művelettel van megvalósítva. Egyes implementációkban van olyan függvény, amely visszaadja a verem aktuális hosszát. Egy másik tipikus segédművelet a "top" (más néven "peek"), amely vissza tudja adni a verem aktuális legfelső elemét anélkül, hogy eltávolítaná azt. Egy másik gyakori művelet a "dup", amely másolatot készít a verem tetején lévő elemről.
Kapcsolódó oldalak
- Stack gép
Keres