Materi Ke 5 C++ STACK
Materi Ke 5 C++ STACK
STACK <TUMPUKAN>
ILMU KOMPUTER
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.
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
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
24 March 2022 11
Operasi-operasi Pada Stack
• INITIAL : Membuat Sebuah Stack
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)
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
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
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
24 March 2022 32
Contoh : A+B*2/C-D → AB2*C/+D-
24 March 2022 34
Tabel Prioritas
24 March 2022 35
Mekanisme konversi
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
24 March 2022 40