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!

Szerző: Leandro Alegsa

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.Zoom
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
AlegsaOnline.com - 2020 / 2025 - License CC3