Download as pdf or txt
Download as pdf or txt
You are on page 1of 14

Fakultet informacijskih tehnologija

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.

Osnovne osobine steka su:

 Pristup steku je dozvoljen samo na jednom kraju (vrhu steka);

 Akcija dodavanja novog elementa u stek se naziva ubacivanje (eng. pushing);

 Akcija uklanjanja podatkovnog elementa iz steka se naziva izbacivanje (eng.


popping);

 Stek upravlja podacima po tzv. LIFO principu (eng. Last-In-First-Out): Onaj


podatkovni element koji je zadnji ubačen u stek se prvi izbacuje iz steka.

Postoje dva načina kako možemo realizirati strukturu podataka koju nazivamo stek:

 pomoću nizova (sekvencijalna reprezentacija)

 pomoću povezanih listi (eng. linked lists)

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

 Pri ubacivanju slijedećeg elementa prvo moramo maknuti element sa lokacije


nula na lokaciju 1 da bi napravili prostor za novi element kojeg zatim ubacujemo
na lokaciju 0.

 Ubacivanje novih elemenata u stek nastavljamo tako da prije ubacivanja novog


elementa uvijek prvo moramo maknuti sve prethodno ubačene elemente, a tek
zatim ubaciti novi element na lokaciju 0.

Nadalje, izbacivanje elemenata iz steka radimo na slijedeći način:

 Prvo čitamo element na lokaciji 0 da vidimo da li je to slučajno specijalni znak


koji nam signalizira da je stek prazan. Ako stek nije prazan izbacujemo element
sa lokacije 0.

 Ako stek nije prazan pomjeramo sve elemente da se popuni praznina koja je
nastala uklanjnjem elementa sa vrha steka (lokacija 0).

 Nastavljamo sa izbacivanjem elemenata iz steka sve dok ne naiñemo na


specijalni znak koji nam označava da su svi elementi izbačeni iz steka.

Ovakav način implementacije steka bi bio potpuno neefikasan jer pri


svakom ubacivanju i izbacivanju elemenata moramo obavljati
pomjereanje svih ostalih elemenata u steku. Ako je tip podataka koji je
smješten u steku kompleksan, te ako je broj elemenata u steku veliki, to
može zahtjevati poprilično vremena.

Sekvencijalni način implementacije steka

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.

Prema tome, algoritam za ubacivanje (eng. pushing) elementa u stek je:

1. Ako stek nije pun onda:

2. smjesti novi element na lokaciju na koju pokazuje pokazivač vrha steka.

3. pokazivač vrha steka uvećaj za 1;

Algoritam za izbacivanje (eng. popping) iz steka je:

1. Ako stek nije prazan onda:

2. umanji pokazivač vrha steka za 1.

3. čitaj element na lokaciji na koju pokazuje pokazivač vrha steka;

Vizualizirani opis implementacije 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:

 funkcija push() implementira operaciju ubacivanja elemenata na stek;

 funkcija pop() implementira operaciju izbacivanja elementa sa steka.

Oznaka steka u ovom primjeru je slovo S.

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.

Na slijedećoj slici 2 je prikazana situacija kada se izvršava naredba:

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

Na slici 3 je prikazana situacija kada se izvršava naredba:

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

Nadalje, na slici 4 je prikazana situacija kada se izvršava naredba:

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).

Dalje nastavljamo sa izvršavanjem naredbe:

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

Zatim nastavljamo s još jednom naredbom s kojom se izbacuju elementi sa steka:

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

Iz prethodno grafičkoog prikaza načina obavljanja operacija ubacivanja elemenata na


stek i izbacivanja elemenata sa steka možemo vidjeti da nemamo nikakvog pomjeranja
elemenata unutar radne memorije pri izvršavanju navedenih operacija. Prema tome,
uspjeli smo dizajnirati efikasan sekvencijalni način implementacije steka što nam je i bio
cilj. U nastavku slijedi jedan jednostavan primjer C++ koda koji ilustira prethodno
opisani način implemenatcije steka.

Jednostavan primjer za ilustraciju implementacije steka

Na početku ovog primjera je potrebno napomenuti da se u primjeru koriste uglavnom oni


elementi jezika C++ koji su studentima trenutno poznati. Drugim riječima, u ovom
primjeru nisu korišteni koncepti jezika C++ (npr. klase, objekti) koji još nisu obrañivani u
okviru predmeta koji se bave programiranjem.

11
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba

Primjer ilustrira način implementacije slijedećih funkcija:

 funkcija push() obavlja operaciju ubacivanja elementa na stek

 funkcija pop() obavlja operaciju izbacivanja elementa sa steka

 funkcija init() inicijalizira vrijednost varijable top na vrijednost 0.

 funkcija full() provjerava da li je stek pun.

 funkcija StackPrint() ispisuje elemente steka na standardnom izlazu (monitoru)

U primjeru se koristi i jedna struktura tipa Stack koja se sastoji od dva elementa:

 cjelobrojnog niza v sa kapacitetom od 20 elemenata


 cjelobrojne varijable top koja prikazuje vrh steka.

Struktura je definirana na slijedeći način:

typedef struct
{
int v[20];
int top;
} Stack;

Ovakva nam definicija omogućuje da u našem primjeru definiramo strukturnu varijablu S


tipa Stack koja će nam poslužiti za ilustraciju osnovnih operacija u radu sa stekovima.

Primjer ilustrira implementaciju ključnih operacija u radu sa stekom. Od studenata se


očekuje da samostalno analiziraju ovaj primjer s ciljem razumijevanja načina
implementacije osnovnih elemenata steka. Isto tako, studentima se savjetuje da
prikazani kod unesu i isprobaju u okviru vježbi.

C++ kod primjera je dat u nastavku:

#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 push(Stack *S, int val);


int pop(Stack *S);
void init(Stack *S);
bool full(Stack *S);
void StackPrint(Stack *S);

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);
}

void push(Stack *S, int val)


{
if (!full(S)){
S->v[ S->top ] = val;
(S->top)++; }
else
cout<<"Stek je pun."<<endl;
}

int pop(Stack *S)


{
if (S->top!=0){
(S->top)--;
return (S->v[S->top]);}
else
cout<<"Stek je prazan."<<endl;
}

13
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/
Fakultet informacijskih tehnologija
ProgramiranjeI_sylabus.doc haris.supic@fit.ba

void init(Stack *S)


{
S->top = 0;
}

bool full(Stack *S)


{
return (S->top == 20);
}

void StackPrint(Stack *S)


{
int i;
if (S->top == 0)
cout << "Stek je prazan."<<endl;
else
{
cout <<"Sadrzaj steka: ";
for (i=0;i<S->top;i++)
{
cout<<S->v[i]<<" ";
}
cout<<endl;
}
}

Rezultat izvoñenja gornjeg programa je prikazan na slici 10.

Slika 10

14
Algoritmi i strukture podataka::Predavanje
http://dl.fit.ba/

You might also like