- STMIK DHARMAPALA RIAU

Download Report

Transcript - STMIK DHARMAPALA RIAU

STACK ( TUMPUKAN )
Fajrizal
• Stack ( Tumpukan ) dapat diartikan sbg :
Suatu kumpulan data yang seolah-olah ada data yg
diletakkan diatas data yg lain, yg bisa menyisipkan (
menambah ) data serta mengambil ( menghapus data ).
• Cara penggambaran stack :
D
Top
C
B
A
Bottom
• Operasi yg dpt dilakukan dalam stack :
1. Menyisipkan / menambahkan data pd ujung atas stack
 push
2. Menghapus / mengeluarkan data dr ujung atas stack
 pop
• Prinsip kerja stack adalah LIFO ( Last In First Out )
• Example :
Kondisi awal Stack
1
4
Pop ( S )
B
A
2
5
A
3
Push ( S, A )
C
Push ( S, C )
B
Push ( S, B )
A
Pop ( S )
A
6
D
Push ( S, D )
C
Push ( S, C )
B
Push ( S, B )
A
• Latihan :
Gambarkan keadaan stack utk operasi berikut (
diasumsikan keadaan awal stack kosong ), stack
dapat menampung max 4 elemen berupa data NIM.
a. Tambahkan 2 no NIM ke dalam stack yaitu (
0631521001 & 0631521002 )
b. keluarkan 1 elemen dari stack
c. Tambahkan 3 elemen berikutnya ke dalam stack
dg
data
(0631521003
&
0631521004
&
0631521005 )
• Penyajian awal Stack :
Dalam Pascal dikenal type data terstruktur yg disebut ARRAY
(LARIK). Dapat digunakan u menyajikan sebuah tumpukan.
Tapi penyajian dg mengg. ARRAY adalah kurang tepat karena
banyaknya elemen dalam array adalah statis.
Sedangkan dalam tumpukan, banyaknya elemen dapat
bervariasi ( dinamis ).
Meskipun demikian, ARRAY dapat digunakan u menyajikan
sebuah tumpukan dg anggapan bahwa banyaknya elemen
max dari tumpukan tsb tidak akan melebihi batas max
banyaknya elemen dalam array.
• Pada saat ukuran tumpukan = ukuran array, jika
ditambahkan data baru akan menyebabkan “OVERFLOW”.
• Dengan demikian perlu adanya data tambahan u mencatat
posisi ujung atas tumpukan.
• Dengan kebutuhan ini, penyajian tumpukan dapat
dilakukan dengan menggunakan type data terstruktur yang
lain yaitu RECORD ( Rekaman ) yg terdiri dari 2 field :
- Field 1  Digunakan u menyimpan elemen tumpukan yg
bertype array
- Field 2  Digunakan u mencatat posisi atas ujung
tumpukan.
Deklarasi STACK secara umum :
const MaxElemen =255;
type Tumpukan = record
Isi : array[1..MaxElemen] of string;
atas : 0..MaxElemen
end;
var T : Tumpukan;
•
Operasi PUSH :
1
procedure PUSH ( var T : Tumpukan; X : string );
begin
T.Atas :=T.Atas + 1;
T.Isi[T.Atas] := X
end;
2
procedure PUSH ( var T : Tumpukan; X : string );
begin
if T.Atas = MaxElemen then
writeln ( ‘ TUMPUKAN SUDAH PENUH ‘ )
else
begin
T.Atas :=T.Atas + 1;
T.Isi[T.Atas] := X
end
end;
• Operasi POP :
1
2
procedure POP ( var T : Tumpukan);
begin
T.Atas :=T.Atas - 1
end;
procedure POP ( var T : Tumpukan);
begin
if T.Atas = 0 then
writeln ( ‘ TUMPUKAN SUDAH KOSONG ‘ )
else
begin
T.Atas :=T.Atas - 1
end
end;
PENULISAN UNGKAPAN NUMERIS DALAM STACK
• Salah satu aplikasi STACK adalah untuk menulis ungkapan
dengan menggunakan notasi tertentu.
• Cara penulisan ungkapan dapat dilakukan dengan
menggunakan :
1. Notasi INFIX
Operator diletakkan diantara 2 operand
ex : A+B  dimana A,B sbg operand dan + sbg operator
2. Notasi PREFIX ( POLISH )
Operator diletakkan sebelum 2 operand disajikan
ex : +AB
3. Notasi POSTFIX ( SUFFIX )
operator diletakkan setelah 2 operand disajikan
ex : AB+
•
•
•
•
•
Dalam penulisan ungkapan, khususnya ungkapan numeris
seringkali digunakan tanda kurung u mengelompokkan bagian
mana yg harus dikerjakan lebih dahulu.
Dalam ungkapan2 yg rumit, pemakaian tanda kurung ini tidak bisa
dihindari.
“ Semakin rumit ungkapan maka semakin banyak dibutuhkan
tanda kurung “.
Hal ini membawa suatu konsekwensi bahwa penulisan tanda
kurung itupun harus benar2 terhindar dari kesalahan.
Contoh : ( dalam notasi infix ) DG METODE SUBSTITUSI
1. A + B x C
Notasi Prefix
Notasi Postfix
xBC  1
BCx  1
1
+A1  2
A1+  2
2
•
Latihan :
2.
(A + B) x (C –(D ^ E))
3.
(A x B) – ( C + D ) / ( E x ( F – G ) )
Algorithma Konversi dari Infix ke Postfix
•
Langkah 0 ( Awal )
- Baca ungkapan dalam notasi infix, misalnya = S
- Tentukan panjang ungkapan tersebut, misalnya N karakter
- Siapkan sebuah tumpukan kosong & siapkan derajad
masing2 operator, misalnya :
^ pangkat = bernilai 3
x , / = bernilai 2
+ , - = bernilai 1
) , ( = bernilai 0
•
Langkah 1
Dimulai dari I=1 sampai N, kerjakan langkah2 berikut
a. R = S [ I ]
b. Test nilai R, jika R adalah :
operand : langsung ditulis
kurung buka : push ke dalam tumpukan
kurung tutup : pop dan tulis semua isi tumpukan sampai ujung
tumpukan = ‘(‘. Pop juga tanda ‘(‘ ini, tapi tidak
usah ditulis.
operator : jika tumpukan kosong, atau derajad R
lebih tinggi dibanding derajad ujung
tumpukan, push operator ke dalam
tumpukan. Jika tidak, pop ujung
tumpukan da tulis, kemudian ulangi
pembandingan R ujung tumpukan.
Kemudian R di push.
• Langkah 2
Jika akhir notasi infix telah tercapai, dan tumpukan masih
belum kosong, pop semua isi tumpukan dan tulis hasilnya.
1. ( A + B ) x ( C – D )  N = 11 karakter
Proses
ke
1
2
3
4
5
6
7
8
9
10
11
Karakter
dibaca ( R )
Isi Stack
(
A
+
B
)
*
(
C
D
)
(
Karakter
tercatat
Notasi
Postfix
terbentuk
A
A
B
+
AB
AB+
C
AB+C
D
*
AB+CD
AB+CDAB+CD-*
+(
Kosong
*
(*
-(*
*
Kosong
( K ^ ( L + M )) + ( N – O )  N = 15 karakter
Proses
ke
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Karakter dibaca
Isi Stack
(
K
^
(
L
+
M
)
(
+
(
N
O
)
Karakter
tercatat
Notasi Postfix
terbentuk
K
K
L
KL
M
+
^
KLM
KLM +
KLM +^
N
KLM +^ N
O
+
KLM +^ NO
KLM +^ NOKLM +^ NO- +
^(
(^(
+(^(
(^(
((
Kosong
+
(+
-( +
(+
+
kosong
2. (A + B) * (C – D) ^ E  N = 13 karakter
Proses
ke
Karakter
dibaca ( R )
Isi Stack
1
2
3
4
5
6
7
8
9
10
11
(
A
+
B
)
*
(
C
D
)
(
12
13
^
E
Karakter
tercatat
Notasi
Postfix
terbentuk
A
A
B
+
AB
AB+
C
AB+C
D
*
AB+CD
AB+CDAB+CD-*
E
^
AB+CD-*E
AB+CD-*E^
+(
Kosong
*
(*
-(*
*
Kosong
^
Kosong
•
Cara Substitusi :
(AxB)x(C–D)
2
1
3
Infix
1. A*B
2. C-D
3. 1*2
LATIHAN :
1.
2.
A+B*C–D^E
(A * B) – ( C + D ) / ( E * ( F – G ))
Postfix
1. AB*
2. CD3. 12*
4. AB*CD-*
Algorithma Konversi dari Infix ke Prefix
•
Langkah 0 ( Awal )
- Baca ungkapan dalam notasi infix, misalnya = S
- Tentukan panjang ungkapan tersebut, misalnya N karakter
- Siapkan sebuah tumpukan kosong & siapkan derajad
masing2 operator, misalnya :
$ pangkat = bernilai 3
x , / = bernilai 2
+ , - = bernilai 1
) , ( = bernilai 0
•
Langkah 1
Dimulai dari I=N sampai 1, kerjakan langkah2 berikut
a. R = S [ I ]
b. Test nilai R, jika R adalah :
operand : langsung ditulis & simpan ke var T
kurung tutup : push ke dalam tumpukan
kurung buka : pop dan tulis semua isi tumpukan sampai ujung
tumpukan = ‘)‘. Pop juga tanda ‘)‘ ini, tapi tidak
usah ditulis.
operator : jika tumpukan kosong, atau derajad R
lebih tinggi atau sama dibanding
derajad
ujung
tumpukan,
push
operator ke dalam tumpukan.
Jika
tidak, pop ujung tumpukan
dan tulis
disimpan ke var T, kemudian
ulangi
pembandingan
R
ujung
tumpukan.
Kemudian R di push.
• Langkah 2
Jika akhir notasi infix telah tercapai, dan tumpukan masih
belum kosong, pop semua isi tumpukan dan tulis hasilnya,
kemudian simpan ke var T.
• Langkah 3
Baca data dalam variabel T, dimulai dari N sampai 1 dan
tulis ke dalam notasi prefix.
• ( A + B ) x ( C – D )  N = 11 karakter
Pro
ses
ke
1
2
3
4
5
6
7
8
9
10
11
12
13
Karakter
dibaca ( R )
Isi Stack
)
D
C
(
*
)
B
+
A
(
)
Karakter
tercatat
Isi Variabel T
Notasi Prefix
( Notasi Postfix ) terbentuk
D
D
C
-
DC
DC-
B
DC-B
A
+
*
DC-BA
DC-BA+
DC-BA+*
-)
Kosong
*
)*
+)*
*
Kosong
*+AB-CD
• SELESAIKAN :
(A + B) * (C – D) ^ E
A*B–(C+D)/(E*(F–G))
Proses ke
Karakter dibaca ( R
)
Isi Stack
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(
(
P
Q
)
+
R
)
X
(
S
^
T
)
(
((
16
17
18
19
20
21
/
((
U
/
V
)
22
23
24
+
W
)
Karakter tercatat
Notasi Postfix
terbentuk
P
P
PQ
-
PQ
PQ-
R
+
PQ-R
PQ-R+
S
PQ-R+S
T
^
*
PQ-R+ST
PQ-R+ST^
PQ-R+ST^*
U
PQ-R+ST^*U
V
/
/
PQ-R+ST^*UV
PQ-R+ST^*UV/
PQ-R+ST^*UV//
W
+
PQ-R+ST^*UV//W
PQ-R+ST^*UV//W+
-( (
KOSONG
+
KOSONG
X
(X
^(X
*
KOSONG
/
((/
/((/
((/
KOSONG
+
KOSONG