5. Zásobník
5.1 Čo je to?
Zásobník (stack) je taký lineárny zoznam, na ktorom sú definované iba tieto operácie:
- vytvoriť prázdny zásobník
- pridať nový prvok na vrch zásobníka (na začiatok zoznamu)
- odobrať prvok z vrchu zásobníka (zo začiatku zoznamu)
- zistiť, či je zásobník prázdny
Operácia "vlož prvok do zásobníka" sa niekedy v literatúre označuje push. Operácia "vyber prvok zo zásobníka" sa nazýva pop.
Graficky sa zásobník implementovaný ako jednosmerný lineárny zoznam znázorňuje väčšinou takto:  | h1,h2, h3, ..., hn sú hodnoty prvkov, ktoré sme do zásobníka vložili
Ako
ste si isto všimli, prvok, ktorý bol do zásobníka vložený ako posledný,
nachádza sa na vrchu zásobníka (na začiatku zoznamu).
Prvky sú v zásobníku uložené v opačnom poradí, než v akom sme ich do zásobníka vkladali ! |
Prvok v zásobníku, ktorý nemá nasledovníka, nazýva sa aj dno zásobníka.
Princíp,
podľa ktorého sa ako prvý musí vždy odstrániť ten prvok zásobníka,
ktorý bol do neho vložený ako posledný, sa označuje ako princíp LIFO (z angl. Last In First Out - "posledný príde, prvý odíde").
Zásobník sa preto nazýva aj pamäť LIFO.
|  |
Pri práci so zásobníkom si stačí uvedomiť, že priamy
prístup (pomocou ukazovateľa na vrch zásobníka) máme len k prvku, ktorý
bol vložený ako posledný. Ak chceme pracovať s nejakým iným prvkom v
zásobníku, musíme najskôr všetky prvky, ktoré sú nad ním zo zásobníka
vybrať (odstrániť alebo premiestniť do pomocného zásobníka).
Zásobníky hrajú dôležitú úlohu pri syntaktickej analýze
a konštrukcii prekladačov. Prvoradý význam však majú pri realizovaní
rekurzie, kde sa pri každom rekurzívnom volaní funkcie do zásobníka
uloží záznam s lokálnymi premennými volanej funkcie a tiež
informácia o momentálnom stave výpočtu. Rekurzívny výpočet končí
vyprázdnením zásobníka. Vzhľadom na vysoké pamäťové nároky je pri
použití rekurzie dobré vedieť odhadnúť jej maximálnu hĺbku. Pri veľkom
počte rekurzívnych volaní (napr. pri nekonečnej rekurzii) hrozí totiž
preplnenie zásobníka a následne "havária" programu! Nielen pri
rekurzii, ale vždy keď sa s nejakej funkcie volá iná funkcia,
treba realizáciu volajúcej funkcie prerušiť - uložiť návratovú adresu
a začať vypĺňať nový záznam pre volanú funkciu. Často
sa stáva, že úloha potrebuje viac zásobníkov toho istého údajového typu
- tzv. homogénne zásobníky. V tomto prípade sa definuje pole, ktoré
obsahuje ukazovatele na všetky zásobníky.
Zásobník sa dá implementovať aj jednorozmerným poľom.
Prvý prvok poľa je zvyčajne dno zásobníka, posledný prvok v poli je
vrch zásobníka. Ukazovateľ na vrch zásobníka je tu nahradený premennou,
v ktorej je uložený index posledného vloženého prvku (t.j. počet prvkov
poľa). Nevýhodou je, že musíme vopred obmedziť veľkosť zásobníka stanovením rozsahu použitého poľa.
Precvičme si
Vytvorte
program, ktorý bude vo forme menu umožňovať prácu so zásobníkom -
umožní vložiť prvok do zásobníka, vybrať prvok zo zásobníka, zistiť či
je prázdny, zistiť, či sa v ňom nachádza nejaký prvok, vyprázdniť celý
zásobník, vypísať obsah zásobníka. Prvkami zásobníka nech sú celé čísla.
|
| [Riešenie]
|
|