Professional Documents
Culture Documents
P6 Stek 2006 07
P6 Stek 2006 07
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Datum: 21.03.2007
Predavanje br. 6
Koncept steka
Stek je ureñena grupa homogenih elemenata kod koje se izbacivanje i dodavanje novih
elemenata može obaviti jedino na vrhu grupe. Prema tome, stek je struktura podataka
koja nameće neka ograničenja. Iako se stek kao struktura podataka često koristi u
računarstvu, mnogi programski jezici nemaju definiran ugrañeni standardni tip steka.
Zato je potrebno da se upoznamo sa načinom implementacije steka preko standardnih
tipova.
Postoje dva načina kako možemo realizirati strukturu podataka koju nazivamo stek:
Ako bi htjeli implementirati stek direktno iz prethodno navedenog opisa onda bi jedan
mogući način razmišljanja kako implementirati stek, odnosno, kako implementirati
operacije ubacivanja elementa u stek i izbacivanja elementa iz steka, bio slijedeći:
Izaberemo neku vrijednost (na primjer ASCII 0 ako u stek smještamo znakove)
kojom ćemo inicijalizirati sve elemente niza.
Pri ubacivanju prvog elementa koristimu lokaciju s indeksom 0 (uzeli smo u obzir
da indeksi lokacija za C++ nizove počinju od nule).
1
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Ako stek nije prazan pomjeramo sve elemente da se popuni praznina koja je
nastala uklanjnjem elementa sa vrha steka (lokacija 0).
Umjesto da definiramo vrh steka na lokaciji 0 u nekom nizu, definirat ćemo dno steka na
toj lokaciji. Stek će zatim rasti u datom nizu tako da će lokacija vrha steka ovisiti o broju
elemenata u steku. Prvi element koji se dodaje u prazan stek će biti smješten na lokaciji
0, slijedeći element će biti smješten na lokaciji 1, slijedeći na lokaciji 2, itd. Možemo
zaključiti da će nam za oblikovanje steka na ovaj način biti potrebno praćenje gdje se
nalazi vrh steka nakon svakog ubacivanja i izbacivanja iz steka. To lako možemo uraditi
na taj način da ćemo definirati jednu cjelobrojnu varijablu koja će predstavljati indeks
2
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
niza, odnosno, lokaciju u nizu koja se koristi kao vrh steka. Taj indeks ćemo zvati
pokazivač vrha steka.
Da bi na što jednostavniji način opisali najbitnije elemente steka kao strukture podataka
na slijedećim slikama su grafički prikazana stanja steka pri obavljanju ubacivanja
elemenata u stek i izbacivanja elemenata iz steka. Zbog jednostavnosti je
pretpostavljeno da se se u stek ubacuju cjelobrojni elementi, mada u općem slučaju
elementi steka mogu biti mnogo kompleksniji objekti. Kao indikator lokacije niza na kojoj
se nalazi vrh steka koristi se varijabla top (vidjeti sliku 1). Cijeli brojevi kao elementi
steka se smještaju u niz v koji u ovom slučaju ima kapacitet od 20 elemenata. U ovom
vizualiziranom opisu steka ćemo koristiti dvije funkcije:
3
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 1
Osjenčeni dio programskog koda s desne strane (slika 1) prikazuje koja se trenutno
naredba izvršava. Vidimo da je u početnom stanju kada je stek prazan vrijednost
varijable top jednaka 0. Upravo ova vrijednost top=0 zapravo označava vrh steka i
signalizira da je stek prazan.
push(&S, broj)
kojom se na stek S stavlja vrijednost varijable broj koja u ovom primjeru iznosi 3. Pošto
je oznaka vrha steka top=0 na lokaciju s indeksom 0 u nizu v će se smjestiti broj 3, a
varijabla top će se povećati za jedan i poprimit će vrijednost 1 (vidjeti sliku 2).
4
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 2
push(&S, 5)
kojom se na stek S stavlja broj 5. Pošto je oznaka vrha steka top=1 na lokaciju s
indeksom 1 u nizu v će se smjestiti broj 5, a varijabla top će se povećati za jedan i
poprimit će vrijednost 2 (vidjeti sliku 3).
Slika 3
5
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 4
push(&S, 8)
kojom se na stek S stavlja broj 8. Pošto je oznaka vrha steka top=2 na lokaciju s
indeksom 2 u nizu v će se smjestiti broj 8, a varijabla top će se ponovno povećati za
jedan i poprimit će vrijednost 3 (vidjeti sliku 4).
push(&S, 4)
kojom se na stek S stavlja broj 4. Pošto je oznaka vrha steka top=3 na lokaciju s
indeksom 3 u nizu v će se smjestiti broj 4, a varijabla top će se ponovno povećati za
jedan i poprimit će vrijednost 4 (vidjeti sliku 5).
6
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 5
Sada dolaze dvije naredbe pomoću kojih se skidaju elementi sa steka. Naredba s kojom
se izbacuju elementi sa steka S u ovom primjeru je:
pop(&S)
Na slici 6 je prikazano trenutno stanje na steku nakon izvršenja gornje naredbe. Obratite
pažnju šta se dogaña sa varijablom top koja se umanjuje za jedan i sada iznosi 3.
Primijetite isto tako da ne trebamo brisati element 4 iz niza iako je on zapravo izbačen iz
steka. Naime, varijabla top koja trenutno iznosi top=3 označava trenutni vrh steka, pa
prema našem primjeru trenutni element na vrhu steka dobivamo tako da uzimamo
element sa lokacije s indeksom top-1, a to znači da je trenutni element na vrhu steka
broj 8.
7
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 6
pop(&S)
Na slici 7 je prikazano trenutno stanje na steku nakon izvršenja gornje naredbe. Varijabla
top se umanjuje za jedan i sada iznosi 2. Kao i u prethodnom izbacivanju ne trebamo
brisati element 8 iz niza iako je on zapravo izbačen iz steka. Naime, varijabla top koja
trenutno iznosi top=2 označava trenutni vrh steka, a novi element na vrhu steka
dobivamo tako da uzimamo element sa lokacije s indeksom top-1, a to znači da je
trenutni element na vrhu steka broj 5.
8
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 7
U nastavku (slika 8) imamo još dvije naredbe kojima se ubacuju dva broja na stek. Prva
naredba je:
push(&S, 12)
kojom se na stek S stavlja broj 12. Pošto je oznaka vrha steka top=2 na lokaciju s
indeksom 2 u nizu v će se smjestiti broj 12, a varijabla top će se ponovno povećati za
jedan i poprimit će vrijednost 3 (vidjeti sliku 8). Primijetite da je broj 12 upisan preko
broja 8 koji se nekada nalazio na steku. Broj 4 nije sastavni dio steka jer varijabla top
kao indikator vrha steka ima vrijednost 3. Vrh steka je na lokaciji s indeksom top-1.
9
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 8
I konačno (slika 9) na kraju imamo još jednu naredbu kojom ubacujemo broj 16 na
stek:
push(&S, 16)
Pošto je oznaka vrha steka top=3 na lokaciju s indeksom 3 u nizu v će se smjestiti broj
16, a varijabla top će se ponovno povećati za jedan i poprimit će vrijednost 4 (vidjeti
sliku 9). Primijetite da je broj 16 upisan preko broja 4 koji se nekada nalazio na steku.
10
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 9
11
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
U primjeru se koristi i jedna struktura tipa Stack koja se sastoji od dva elementa:
typedef struct
{
int v[20];
int top;
} Stack;
#include <iostream>
using namespace std;
typedef struct
{
int v[20];
int top;
} Stack;
12
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
void main()
{
Stack S;
init(&S);
cout<<"STANJE NA STEKU:";
StackPrint(&S);
cout<<"Ubacujemo na stek 7,2,4,8,3"<<endl;
push(&S, 7);
push(&S, 2);
push(&S, 4);
push(&S, 8);
push(&S, 3);
StackPrint(&S);
cout<<"Uzimamo sa steka dva broja"<<endl;
pop(&S);
pop(&S);
StackPrint(&S);
cout<<"Stavljamo na stek 6"<<endl;
push(&S, 6);
StackPrint(&S);
cout<<"Uzimamo sa steka dva broja, sabiremo ih i rezultat stavljamo na
stek"<<endl;
push(&S, pop(&S) + pop(&S));
StackPrint(&S);
}
13
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba
Slika 10
14
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/