Anda di halaman 1dari 40

STRUKTUR DATA

STACK <TUMPUKAN>

ILMU KOMPUTER

Drs. Lamhot Sitorus, M.Kom


Stack (Tumpukan)
• Stack adalah kumpulan elemen data yang
disimpan dalam satu lajur linier.
• Elemen hanya dapat diakses dari satu
pintu saja
• Sistem pengaksesan pada stack
menggunakan LIFO
• Stack dapat digambarkan secara
Horizontal atau Vertikal

24 March 2022 2
• Misalkan diketahui suatu Stack S dengan maksimum 5
elemen. Andaikan elemen-elemen A, B, C, D dan E
dimasukkan (PUSH) secara berturut-turut maka elemen
A akan menempati posisi pertama (1), elemen B pada
posisi ke 2, elemen C pada posisi ke 3, elemen D pada
posisi ke 4 dan elemen E pada posisi ke 5.

• Perhatikan bahwa petunjuk Max tidak akan pernah


bergerak

• Petunjuk Top akan bertambah satu jika ada elemen


masuk (PUSH) ke dalam Stack hingga Top = Max

• Perhatikan simulasi berikut

24 March 2022 3
Max
5 5 Max

4 4
3 3
2 2
1 1 A Top

0 Top
0
(a)
(b)

24 March 2022 4
5 Max
5 Max
4
4
3 3 C Top

2 B
2 B Top

A 1 A
1
0 0
(c) (d)

24 March 2022 5
5 Max
5 E Max =Top
4 D Top
4 D

3 C
3 C
2 B
2 B
1 A
1 A
0 0
(e)
(f)

24 March 2022 6
• Operasi pengambilan elemen dari suatu Stack
(POP) juga dapat dilakukan

• Setiap kali operasi POP dilakukan maka


petunjuk Top akan berkurang satu

• Suatu Stack dikatakan kosong jika dan hanya


jika Top bernilai 0 (nol) atau menunjuk posisi 0
(nol)

• Demikian juga halnya suatu Stack dikatakan


Penuh jika dan hanya jika Top sama dengan
Max (Top = Max)

24 March 2022 7
5 E Max=Top 5 Max
4 D D
4 Top

3 C C
3
2 B B
2
1 A A
1
0 0
(a) (b)

24 March 2022 8
5 Max 5 Max

4 4
3 C Top 3
2 B B
2 Top

1 A A
1
0 0
(c) (d)

24 March 2022 9
Max
5 Max 5
4 4
3 3
2 2
1 A Top 1
0 0 Top

(e) (f)

24 March 2022 10
Karakteristik Stack
• Elemen Stack yaitu item data yang terdapat dalam
Stack

• Top menunjukkan posisi puncak pada Stack

• Max menunjukkan banyaknya maksimum item data dari


Stack

• Stack Kosong tidak mungkin dilakukan POP karena


akan menyebabkan Underflow

• Stack Penuh tidak mungkin dilakukan PUSH karena


akan menyebabkan Overload

24 March 2022 11
Operasi-operasi Pada Stack
• INITIAL : Membuat Sebuah Stack

• FULL : Fungsi yang menyatakan suatu Stack Penuh


atau tidak

• PUSH : Menambah sebuah elemen kedalam Stack

• POP : Mengambil elemen paling atas pada Stack

• Empty : Fungsi untuk menentukan apakah Stack


Kosong atau tidak

• CLEAR : Mengosongkan Stack (Top  0)

24 March 2022 12
• Penggunaan Stack
– Simulasi Stack dalam dunia nyata
– Pemanggilan Fungsi / Procedure
– Rekursif
– Penanganan Interupsi
– Evaluasi Ekspresi
– Konversi Notasi Infiks ke notasi Postfiks
– Konversi bilangan basis 10 (desimal) ke basis
2 (biner)

• Berikut Algoritma dari Stack

24 March 2022 13
DEKLARASI STACK

#define MaxS n
struct Stack
{
TypeData Isi[MaxS];
TypeData Top;
};

24 March 2022 14
Initialization
void INITS (Stack &S)
{
S.Top = 0;
}

PUSH
void PUSH(Stack &S, char Data)
{
if (S.Top < MaxS)
{
S.Top++;
S.Isi[S.Top] = Data;
}
else
cout<<"Stack Penuh ......";
}

24 March 2022 15
POP

void POP(Stack &S, char &Hsl)


{
if (S.Top != 0)
{
Hsl = S.Isi[S.Top];
S.Top--;
}
else
cout<<"Stack Kosong…...";
}

24 March 2022 16
Cetak
void CETAK(Stack S)
{
int i;
cout<<endl<<"Isi Stack : ";
if (S.Top != 0)
{
for(i=1;i<=S.Top;i++)
{
cout<<S.Isi[i];
}
}
else
cout<<"Stack Kosong....";
}

24 March 2022 17
Ekspresi Aritmatika
(Infiks, Postfiks dan Prefiks)
• Ekpresi → String, Numerik dan Logika
• Ekspresi Numerik → Unary, Binary dan Ternary
• Ekspresi Numerik Binary → Prefiks, Infiks dan Postfiks
• Notasi Infiks : A+B
• Notasi Prefiks : +AB
• Notasi Postfiks : AB+

24 March 2022 18
Ekspresi Aritmatika
(Infiks, Postfiks dan Prefiks)
• Notasi Aritmatika biasanya ditulis dengan notasi Infiks →
A+B-C
• Mudah dimengerti manusia
• Perlu diperhatikan prioritas
• Contoh : (A-B)*(C+D)
– Kurung pertama : (A-B)
– Kurung berikutnya : (C+D)
– Perkalian hasil pengurangan dan perjumlahan
• Pada saat kompilasi notasi infiks dirubah menjadi notasi
Postfiks karena lebih mudah dikerjakan komputer

24 March 2022 19
Konversi Notasi
• Notasi Infiks ke Prefiks : (A+B)-(C*D)
– Kurung pertama : (A+B) → +AB
– Kurung kedua : (C*D) → *CD
– Operator kurang (-) : +AB - *CD →-+AB*CD

24 March 2022 20
Konversi Notasi
• Notasi Infiks ke Postfiks : (A+B)-(C*D)
– Kurung pertama : (A+B) → AB+
– Kurung kedua : (C*D) → CD*
– Operator kurang (-) : AB+ - CD* → AB+CD*-

24 March 2022 21
Konversi Notasi
• Notasi Prefiks ke Infiks : +/*ABCD
• Untuk mengerjakan prefiks, dengan
mencari operator mulai dari kanan
– Cari operator pertama *, ambil dua operand
sebelumnya yaitu A dan B →(A*B)
– Cari operator kedua /, ambil dua operand
sebelumnya yaitu (A*B) dan C →((A*B)/C)
– Cari operator ketiga +, ambil dua operand
sebelumnya yaitu ((A*B)/C) dan D →
(((A*B)/C) + D)
24 March 2022 22
Konversi Notasi
• Notasi Prefiks ke Postfiks : +/*ABCD
• Untuk mengerjakan prefiks, dengan
mencari operator mulai dari kanan
– Cari operator pertama *, ambil dua operand
sebelumnya yaitu A dan B →AB*
– Cari operator kedua /, ambil dua operand
sebelumnya yaitu AB* dan C →AB*C/
– Cari operator ketiga +, ambil dua operand
sebelumnya yaitu AB*C/ dan D → AB*C/ D+
24 March 2022 23
Konversi Notasi
• Notasi Postfiks ke Infiks : ABCD*/-
• Untuk mengerjakan postfiks, dengan
mencari operator mulai dari Kiri
– Cari operator pertama *, ambil dua operand
sebelumnya yaitu C dan D →(C*D)
– Cari operator kedua /, ambil dua operand
sebelumnya yaitu B dan (C*D) →(B/(C*D))
– Cari operator ketiga -, ambil dua operand
sebelumnya yaitu A dan (B/(C*D)) → (A-
(B/(C*D)))
24 March 2022 24
Konversi Notasi
• Notasi Postfiks ke Prefiks : ABCD*/-
• Untuk mengerjakan Postfiks, dengan
mencari operator mulai dari Kiri
– Cari operator pertama *, ambil dua operand
sebelumnya yaitu C dan D →*CD
– Cari operator kedua /, ambil dua operand
sebelumnya yaitu B dan *CD → /B*CD
– Cari operator ketiga -, ambil dua operand
sebelumnya yaitu A dan /B*CD → -A/B*CD
24 March 2022 25
Evaluasi Notasi Postfiks
• Buat Stack kosong
• Ambil elemen satu persatu dari kiri
• Jika elemen itu adalah operand maka masukkan ke
Stack, dan jika operator maka keluarkan dua nilai teratas
dari Stack (operand2 dan operand1) lalu hitung dengan
operator yang bersangkutan, hasilnya masukkan
kedalam Stack. Perlu diperhatikan bahwa jika tidak ada
2 operand dalam Stack, maka ada kesalahan pada
notasi tersebut
• Ulangi langkah ke – 2 dan ke – 3 sampai elemen dalam
notasi Postfiks habis. Jika telah habis, maka elemen
yang tinggal adalah elemen hasil

24 March 2022 26
Evaluasi Notasi Postfiks Dengan Stack

• Infiks : 2-4*3+1
• Postfiks : 243*-1+
• Evaluasi :

2 4 3 * - 1 +

3 Op2

4 4 Op1
12 Op2
1 Op2

2 2 2 2 Op1
-10 -10 Op1
-9

24 March 2022 27
Evaluasi Notasi Prefiks
• Buat Stack kosong
• Ambil elemen satu persatu dari kanan
• Jika elemen itu adalah operand maka masukkan ke
Stack, dan jika operator maka keluarkan dua nilai teratas
dari Stack (operand1 dan operand2) lalu hitung dengan
operator yang bersangkutan, hasilnya masukkan
kedalam Stack. Perlu diperhatikan bahwa jika tidak ada
2 operand dalam Stack, maka ada kesalahan pada
notasi tersebut
• Ulangi langkah ke – 2 dan ke – 3 sampai elemen dalam
notasi Prefiks habis. Jika telah habis, maka elemen yang
tinggal adalah elemen hasil

24 March 2022 28
Evaluasi Notasi Prefiks Dengan Stack

• Infiks : 2-4*3+1
• Prefiks : +-2*431
• Evaluasi :

1 3 4 * 2 - +

4 Op1 2 Op1

3 3 Op2
12 12 Op2
-10 Op1

1 1 1 1 1 1 Op2
-9

24 March 2022 29
Konversi Infiks ke Postfiks Dengan Stack

• Ekspresi terdiri dari operand operator dan pembatas


(delimeter)
• Masalahnya memutuskan urutan operasi yang akan
dilakukan
Contoh : XA/B^C+D*E-A*F
Mempunyai arti
X((((A/B)^(C+D))*(E-A))*F)
• Tentukan dengan urutan prioritas operator
• Ekspresi dengan tanda kurung lengkap disebut dengan
penulisan mengikuti wff (well form formula)
• Ekspresi dalam bentuk wff ditulis dengan tanda kurung
lengkap

24 March 2022 30
Konversi Ekspresi Tak Bertanda Kurung
• Satu Stack di inisiasikan kosong
• String infiks merupakan suatu ekspresi infiks tak
bertanda kurung valid
• String postfiks diinisiasikan dengan “” (null string) untuk
menampung hasil konversi
• Tabel tingkat kekuatan simbol

Tingkat Kekuatan Nama Simbol


5 Variabel, Konstanta ‘A’..’Z’,’0’..’9’
4 Sign +, -
3 Pangkat ^
2 Kali dan Bagi *, /
1 Tambah dan Kurang +, -
24 March 2022 31
Mekanisme konversi infiks menjadi Postfiks

• Scan simbol dari kiri ke kanan ekspresi infiks


dan lakukan pada simbol saat itu :
– Bandingkan simbol yang di scan dengan simbol yang
ada pada Stack (posisi TOP)
– Jika tingkat kekuatan simbol di stack lebih besar atau
sama dengan tingkat kekuatan simbol yang discan
maka simbol yang di stack di sambung (Concate)
dengan string Postfiks
– Jika tingkat kekuatan simbol di stack lebih kecil
dengan tingkat kekuatan simbol yang di scan atau
stack kosong maka maka simbol yang discan
dimasukkan (PUSH) ke dalam Stack
– Jika infiks telah kosong maka POP semua isi Stack
satu persatu dan Concate dengan string Postfiks

24 March 2022 32
Contoh : A+B*2/C-D → AB2*C/+D-

Simbol di Scan Isi Stack String Postfiks


#
A #A
+ #+ A
B #+B A
* #+* AB
2 #+*2 AB
/ #+/ AB2*
C #+/C AB2*
- #- AB2*C/+
D #-D AB2*C/+
AB2*C/+D-
24 March 2022 33
Konversi Infiks ke Postfiks menggunakan tanda kurung

• Tanda kurung buka pada string infiks masuk ke Stack


tetapi tidak masuk ke dalam string postfiks

• Tanda kurung buka pada stack nilai prioritasnya berubah


menjadi 0.

• Tanda kurung tutup di scan maka elemen puncak stack


hingga kurung buka pertama di concate terhadap string
Postfiks kecuali tanda buka kurung

• Tanda Kurung tutup tidak pernah masuk ke dalam Stack.

24 March 2022 34
Tabel Prioritas

Prioritas Prioritas karakter


Simbol karakter di scan dalam stack
(fungsi f) (fungsi g)
Tidak pernah masuk stack
) 0
( 9 0
‘A’..’Z’; ‘0’..’9’ 7 8
^ 6 5
*, / 3 4
+, - 1 2

24 March 2022 35
Mekanisme konversi

• Scan simbol dari kiri ke kanan ekspresi infiks


dan lakukan pada simbol saat itu :
– Bandingkan simbol yang di scan (fungsi f) dengan
simbol yang ada pada puncak Stack (fungsi g)
– Jika prioritas simbol di stack (fungsi g) lebih besar
dengan prioritas simbol yang discan (fungsi f) maka
simbol yang distack disambung (Concate) dengan
string Postfiks
– Jika tingkat kekuatan simbol di stack lebih kecil atau
sama dengan tingkat kekuatan simbol yang di scan
atau stack kosong maka simbol yang discan
dimasukkan (PUSH) ke dalam Stack
– Jika infiks telah kosong maka POP semua isi Stack
satu persatu dan Concate dengan string Postfiks

24 March 2022 36
Contoh : (A+B)*(C-D) → AB+CD-*
Simbol di Scan Isi Stack String Postfiks
#
( #(
A #(A
+ #(+ A
B #(+B A
) # AB+
* #* AB+
( #*( AB+
C #*(C AB+
- #*(- AB+C
D #*(-D AB+C

) #* AB+CD-

AB+CD-*

24 March 2022 37
Tugas / Quiz
1. Ubah notasi infiks ke notasi prefiks dan postfiks
a. A/B-C/D
b. (A+B)^3-C*D
2. Ubah notasi prefiks ke notasi infiks dan postfiks
a. +-/ABC^DE
b. -+DE/XY
3. Ubah notasi postfiks ke notasi infiks dan prefiks
a. GH+IJ/*
b. AB^CD+-
4. Hitung hasil evaluasi menggunakan stack
a. Prefiks : -+23/62
b. Postfiks : 67-123+-*
5. Ubahlah notasi infiks berikut ke notasi postfiks dengan
stack
a. 2+5-6*3^4/2-3
b. ((2+5)-(((6*3)^4)/(2-3)))

24 March 2022 38
QUIS
• Tanpa menggunakan Stack konversikan
notasi Infiks ke notasi Prefiks dan Postfiks
kemudian evaluasi
9*2+8^2/4-5+6
• Dengan menggunakan Stack konversikan
notasi berikut ke notasi Postfiks
A+B/C*D^2-E

24 March 2022 39
• Konversi Notasi Infiks ke notasi Postfik
kemudian evaluasi Notasi Postfiks

• Evaluasi Notasi Postfiks dan Prefiks

• Dikumpul pada tanggal 27 Mei 2019,


dilengkapi dengan pembahasannya

24 March 2022 40

Anda mungkin juga menyukai