06. SPA1 - Stek i Red Opsluzivanja
-
Upload
helena-halonen -
Category
Documents
-
view
220 -
download
0
Transcript of 06. SPA1 - Stek i Red Opsluzivanja
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
1/49
STEK I RED OPSLUIVANJA
Strukture podataka i algoritmi 1
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
2/49
2
Stek - koncepti(1)
Stek je sekvenca elemenata bazirana na LIFO
(last-in-first-out) principu.
Elementi se mogu dodavati i uklanjati samo na
jednoj strani sekvence (na vrhu steka). Dubinasteka je trenutni broj elemenata u steku.
Prazan stek ima dubinu nula.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
3/49
3
Stek - koncepti(1)
Ilustracija (stek knjiga):
Moby DickWar & Peace
Rob Roy
Inicijalno:
Moby DickWar & Peace
Posle skidanja
knjige:
Moby DickWar & PeaceMisrables
Posle
dodavanja
Misrables:
Moby DickWar & PeaceMisrables
2001
Posle doda-
vanja2001:
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
4/49
Stek: zahtevi
1) Napraviti prazan stek.
2) Dodati (push) element na vrh steka.
3) Ukloniti (pop) element sa vrha steka.4) Testirati da li je stek prazan (i/ili pun).
5) Pristupiti elementu sa vrha steka bez uklanjanja.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
5/49
Implementacija steka preko niza (1)
Predstavlja ogranieni stek (dubina maximalnaDubina):
Atrribut topElsadri indeks prvog slobodnog elementatrenutnadubina steka
Niz elementi duinePODRAZUMEVANA_VELICINA, koji sadri
elemente steka.
Stek sa elementima:elementelement
0 1
element
topEl1 topEL PODRAZUMEVANA_VELICINA1
Prazan stek:
1topEl=0 PODRAZUMEVANA_VELICINA1
Ilustracija
(PODRAZUMEVANA_
VELICINA= 6):
Moby
Dick
War &
Peace
Rob Roy
10 2 topEl=3 4 5
Element na vrhu Slobodno mesto
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
6/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
7/49
Implementacija steka preko niza (3)
/*** Kreira nov Stek zadate velicine.*/
public Stek(int n) {topEl = 0;elementi = new Object[n];
}
/*** Kreira novi Stek podrazumevane veliine.
*/public Stek() {
this(PODRAZUMEVANA_VELICINA);}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
8/49
Implementacija steka preko niza (4)
/**
*Vraada li je stek prazan.
*/
public boolean isEmpty() {
return topEl == 0;}
/**
*Vraada li je stek pun.
*/public boolean isFull() {
return topEl == elementi.length;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
9/49
Implementacija steka preko niza (5)
/**
*Vraavrednost elementa na vrhu steka. Ukoliko je stekprazan baca izuzetak.
*/
public Object top() {if (isEmpty()) {
throw new IllegalStateException("Stek je prazan");
} else
return elementi[topEl - 1];
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
10/49
Implementacija steka preko niza (6)
/**
* Skida element sa vrha steka. Ukoliko je stek prazan baca seizuzetak.
*/
public void pop() {if (isEmpty()) {
throw new IllegalStateException("Stek je prazan");
} else
topEl--;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
11/49
Implementacija steka preko niza (7)
/**
* Ubacuje prosleeni element na vrh steka. Ukoliko je stek ve
pun baca se izuzetak.
*/
public void push(Object x) {if (isFull()) {
throw new IllegalStateException("Stek je pun");
} else {
elementi[topEl] = x;
topEl++;
}
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
12/49
12
Red opsluivanja koncepti (1)
Red opsluivanja (queue) je sekvenca
elemenata bazirana na FIFO (first-in-first-out)
principu.
Elementi se mogu dodavati na jednoj strani reda(na kraj) i uklanjati sa druge strane reda (sa
poetka).
Duina reda je trenutni broj elemenata u redu
opsluivanja.
Prazan red ima duinu nula.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
13/49
Red opsluivanja zahtevi
1) Napraviti prazan red opsluivanja.
2) Testirati da li je red opsluivanja prazan.
3) Dodati element na kraj reda opsluivanja.
4) Ukloniti element sa poetka reda opsluivanja.
5) Pristupiti elementu sa poetka reda opsluivanja bezuklanjanja.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
14/49
Red sa
elementima:
0 front rear1 maxlen1
element elementelement
Impl. reda opsl. preko niza (1)
Predstavlja ogranieni red opsluivanja(duina maximalnaDuina): Atributi prvi (front) iposlednji (rear)
Niz elementi duinePODRAZUMEVANA_VELICINA,koji sadri elemente reda opsluivanja:
Prazan red:
0 maxlen1front=rear
slobodnoslobodno Poslednji elementPrvi element
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
15/49
Impl. reda opsl. preko niza (2)
Demonstracija (maximalnaDuina = 6):
Initially:
0 1 2 3 4 5
0front 0rear
elems
0length
0
Homer
1
Marge
2
Bart
3
Lisa
4 5
0front 4rear
elems
4length
After adding Homer, Marge, Bart, Lisa:
0
Homer
1
Marge
2
Bart
3
Lisa
4
Maggie
5
0front 5rear
elems
5length
After adding Maggie:
0 1
Marge
2
Bart
3
Lisa
4
Maggie
5
1front 5rear
elems
4length
After removing the front element:
0 1 2
Bart
3
Lisa
4
Maggie
5
2front 5rear
elems
3length
After removing the front element:
0 1 2
Bart
3
Lisa
4
Maggie
5
Ralph
2front 0rear
elems
4length
After adding Ralph:
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
16/49
Impl. reda opsl. preko niza (3)
Ako moramo pomerati elemente po nizu onda eoperacija za uklanjanje prvog elementa imati
kompleksnost O(n). Ovo moemo izbei ako koristimo kruni niz
umesto obinog niza.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
17/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
18/49
Impl. reda opsl. preko krunog niza (1)
Predstavlja ogranieni red opsluivanja (duina maximalnaDuina):
Atributi prvi (front) iposlednji (rear)
Niz elementi duinePODRAZUMEVANA_VELICINA, kojisadri elemente reda opsluivanja (ili upodnizuelems[frontrear1] ili u elems[frontmaxlen1] ielems[0rear1].
Red sa
elementima:
0 front rear1 maxlen1element elementelement
or: elementelement elementelement0 maxlen1frontrear1
Prazan red:0 maxlen1front=rear
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
19/49
Impl. reda opsl. preko krunog niza (2)
Demonstracija (maximalnaDuina = 6):Initially:
0 1 2 3 4 5
0front 0rear
elems
0length
0
Homer
1
Marge
2
Bart
3
Lisa
4 5
0front 4rear
elems
4length
After adding Homer, Marge, Bart, Lisa:
0
Homer
1
Marge
2
Bart
3
Lisa
4
Maggie
5
0front 5rear
elems
5length
After adding Maggie:
0 1
Marge
2
Bart
3
Lisa
4
Maggie
5
1front 5rear
elems
4length
After removing the front element:
0 1 2
Bart
3
Lisa
4
Maggie
5
2front 5rear
elems
3length
After removing the front element:
0 1 2
Bart
3
Lisa
4
Maggie
5
Ralph
2front 0rear
elems
4length
After adding Ralph:
0
Nelson
1 2
Bart
3
Lisa
4
Maggie
5
Ralph
2front 1rear
elems
5length
After adding Nelson:
0
Nelson
1
Martin
2
Bart
3
Lisa
4
Maggie
5
Ralph
2front 2rear
elems
6length
After adding Martin:
0
Nelson
1
Martin
2 3
Lisa
4
Maggie
5
Ralph
3front 2rear
elems
5length
After removing the front element:
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
20/49
Impl. reda opsl. preko krunog niza (3)
public class RedOpsl {
private int prvi, poslednji;
private Object[] elementi;
/**
*Veliinaredova za koje nije prosledjen parametar oveliini.
*/
public static final int PODRAZUMEVANA_VELICINA = 100;
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
21/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
22/49
Impl. reda opsl. preko krunog niza (5)
/**Pomoni metod za zadravanje indeksaniza u opsegu. Metod uvek vraaindeks sledeeg elementa u odnosu na
onaj koji je prosleen. Sledeielement je za jedno mesto vie odtrenutnog, osim za poslednji kome jesledei prvi.*/private int addOne(int i) {
return (i + 1) % elementi.length;}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
23/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
24/49
Impl. reda opsl. preko krunog niza (7)
/**
*Vraavrednost elementa napoetkureda opsluivanja.Ukoliko je red prazan baca se izuzetak.
*/
public Object first() {if (isEmpty())
throw new IllegalStateException("Red je prazan");
else
return elementi[prvi];
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
25/49
Impl. reda opsl. preko krunog niza (8)
/**
* Izbacuje element sapoetkareda opsluivanja. Ukoliko jered prazan baca se izuzetak.
*/
public void popFirst() {if (isEmpty())
throw new IllegalStateException("Red je prazan");
else if (prvi == poslednji) {
prvi = -1;
poslednji = -1;
} else
prvi = addOne(prvi);
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
26/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
27/49
Implementacija steka preko JPL (1)
Predstavlja (neogranien) stek implementiran JPL,tako da prvi vor liste predstavlja element navrhu.
Elemente stavljamo i ukllanjamo sa vrha (O(1))
Stek sa
elementima:
element element element
Prazan stek:
Primer:RobRoy
War &Peace
MobyDick
Element na vrhu
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
28/49
Stek: zahtevi
1) Napraviti prazan stek.
2) Dodati (push) element na vrh steka.
3) Ukloniti (pop) element sa vrha steka.4) Testirati da li je stek prazan (i/ili punsad nemamo).
5) Pristupiti elementu sa vrha steka bez uklanjanja.
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
29/49
Podseanje
Java klasa koja implementira vorJPL:
publicclassSLLNode {
Object element;
SLLNode succ;
publicSLLNode (Object elem, SLLNode succ) {this.element = elem;this.succ = succ;
}
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
30/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
31/49
Implementacija steka preko JPL (3)
public Object top() {
if (isEmpty()) {
throw new
IllegalStateException("Stek je prazan");
} else
return top.element;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
32/49
Implementacija steka preko JPL (4)
public void pop() {
if (isEmpty()) {
throw new
IllegalStateException("Stek je prazan");
} else
top = top.succ;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
33/49
Implementacija steka preko JPL (5)
public void push(Object x) {
SLLNode novi = new SLLNode(x,null);
novi.succ = top;top = novi;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
34/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
35/49
Impl. reda opsluivanjapreko JPL (1)
U oba sluaja je bar jedna operacija O(n)!
Lisa Bart HomerMarge
Homer Marge LisaBart
prvi
poslednji
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
36/49
Impl. reda opsluivanjapreko JPL (2)
Predstavlja (neogranien) red opsluivanja: JPL ije zaglavlje sadri pokaziva na prvi element (front) i na
poslednji element (rear).
Duina - length(opciono).
Red sa
elementima:
element element elementfront
rear
Prazan red: front
rear
Ilustracija:front
rear
Homer Marge Bart Lisa
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
37/49
Impl. reda opsluivanjapreko JPL (3)
public class RedOpsl {SLLNode prvi, poslednji;
public RedOpsl() {
prvi = null;poslednji = null;
}
public boolean isEmpty() {return prvi == null;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
38/49
Impl. reda opsluivanjapreko JPL (4)
public Object first() {
if (isEmpty())
throw new
IllegalStateException("Red je prazan");else
return prvi.element;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
39/49
Impl. reda opsluivanjapreko JPL (5)
public void popFirst() {
if (isEmpty())
throw new
IllegalStateException("Red je prazan");
else if (prvi == poslednji) {
prvi = null;
poslednji = null;
} elseprvi = prvi.succ;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
40/49
Impl. reda opsluivanjapreko JPL (6)
public void addRear(Object x) {
SLLNode novi = new SLLNode(x,null);
if (isEmpty())
prvi = novi;else
poslednji.succ = novi;
poslednji = novi;
}
P i k li t i ik
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
41/49
Primena krune liste sa graninikom
na implementaciju steka i reda opsl.
PODSEANJE: spoljanji pokaziva pokazuje navetaki element graninik, koji se nalazi izmeuprvog i poslednjeg elementa u listi.
Nema posebnih sluajeva kod ubacivanja prvogelementa u strukturu
Nema posebnih sluajeva kod izbacivanja
poslednjeg elementa iz strukture Kod reda opsluivanja nisu potrebna dva spoljanja
pokazivaa
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
42/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
43/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
44/49
Stekkruna lista sa graninikom (3)
public void pop() {
if (isEmpty()) {
throw new
IllegalStateException("Stek je prazan");
} else
header.succ = header.succ.succ;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
45/49
Stekkruna lista sa graninikom (4)
public void push(Object x) {
SLLNode novi = new SLLNode(x,null);
novi.succ = header.succ;
header.succ = novi;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
46/49
Red opsl.kruna lista sa graninikom (1)
public class RedOpslKruzList {
SLLNode header;
public RedOpslKruzList() {
header = new SLLNode("", null);
header.succ = header;
}
public boolean isEmpty() {
return header == header.succ;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
47/49
Red opsl.kruna lista sa graninikom (2)
public Object first() {
if (isEmpty())
throw new
IllegalStateException("Red je prazan");
else
return header.succ.element;
}
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
48/49
-
7/23/2019 06. SPA1 - Stek i Red Opsluzivanja
49/49
Red opsl.kruna lista sa graninikom (4)
public void addRear(Object x) {
header.element = x;
SLLNode novi = new SLLNode("",null);
novi.succ = header.succ;
header.succ = novi;
header = novi;
}