| Strukture podataka i algoritmi |
| 3.3 Stekovi |
Jos jedan nacin cuvanja podataka je u steku. Stek se obicno implementira sa samo dve glavne operacije (pored konstruktora i destruktora, naravno):
| push | stavlja objekat na stek |
| pop | skida poslednji stavljeni objekat sa steka |
| top | vraca objekat na vrhu steka bez njegovog skidanja [9] |
| isempty | proverava da li je stek prazan |
![]() |
Uobicajeni model steka je gomila tanjira.
Tanjiri se "stavljaju" ("push") na vrh gomile,
i "skidaju" ("pop") takodje sa vrha.
Stekovi obrazuju LIFO (Last-In-First-Out = Poslednji-Unutra-Prvi-Van) redove i imaju mnogo primena pocev od parsiranja algebarskih izraza do ... |
Formalna specifikacija klase stek bi mogla da bude:
typedef struct t_stack *stack;
stack ConsStack( int max_items, int item_size );
/* Kreiraj novi stek
Pre-uslov: (max_items > 0) && (item_size > 0)
Post-uslov: vraca pointer na prazan stek
*/
void Push( stack s, void *item );
/* Stavlja objekat na vrh steka
Pre-uslov: (s je stek kreiran pozivom ConsStack) &&
(postojeci broj objekata < max_items) &&
(item != NULL)
Post-uslov: objekat je dodat na vrh steka s
*/
void *Pop( stack s );
/* Skida objekat sa vrha steka
Pre-uslov: (s je stek kreiran pozivom ConsStack) &&
(postojeci broj objekata >= 1)
Post-uslov: skinut je objekat sa vrha steka s
*/
Primetimo:
Kada funkcija poziva drugu funkciju, najpre se njeni argumenti, zatim adresa povratka i konacno prostor za lokalne promenljive stavljaju na stek poziva. Posto svaka funkcija radi u sopstvenom "okruzenju" ili kontekstu, postaje moguce da funkcija pozove samu sebe - tehnika poznata kao rekurzija. Ova mogucnost je ekstremno korisna - jer se mnogi problemi elegantno specificiraju ili resavaju na rekurzivan nacin.
![]() |
Stek poziva posle izvrsavanja para uzajamno rekurzivnih funkcija:
function f(int x, int y) {
int a;
if ( term_cond ) return ...;
a = .....;
return g(a);
}
function g(int z) {
int p,q;
p = ...; q = ...;
return f(p,q);
}
Primetimo kako se celokupna okruzenja funkcija
f i g
(njihovi parametri i lokalne promenljive) nalaze na steku poziva.
Kada se funkcija f
pozove po drugi put iz funkcije g,
kreira se novi okvir za drugi poziv funkcije f.
|
Kljucni pojmovi |
|
Dalje na Rekurziju Nazad na Sadrzaj |