STRUKTUR DATA PERTEMUAN 5 vandawaa@yahoo.com
ARRAY (LARIK) STACK / TUMPUKAN Contoh penggunaan STACK salah satunya adalah pada program konversi aritmatik mengubah bentuk INFIX ke POSTFIX ataupun INFIX ke PREFIX. Bentuk ini adalah bentuk aritmatik yang digunakan oleh komputer. Bentuk INFIX yang ditulis dalam bahasa pemrograman, akan dikompilasi menjadi bentuk POSTFIX atau PREFIX oleh compiler.
ARRAY (LARIK) A + B * C STACK / TUMPUKAN OPERAND dan OPERATOR DERAJAT OPERATOR PANGKAT $ KALI & BAGI * / TAMBAH & KURANG + - KURUNG BUKA & TUTUP ( )
ARRAY (LARIK) STACK / TUMPUKAN INFIX POSTFIX PREFIX A + B AB + + AB A + B * C ABC *+ *+ ABC INFIX = bentuk aritmatik yang Operatornya ada diantara (di dalam) dua buah Operand. POSTFIX = bentuk aritmatik yang Operatornya ada sesudah dua Operand. PREFIX = bentuk aritmatik yang Operatornya ada sebelum dua Operand.
ARRAY (LARIK) STACK / TUMPUKAN Saat dikompilasi, bahasa pemrograman tidak menggunakan tanda kurung buka ataupun kurung tutup lagi. Urutan pelaksanaan dilakukan tergantung dari letak Operator dan Operandnya, bukan bergantung dari derajat nilai / kekuatan Operator.
ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Hanya OPERATOR yang disimpan ke Stack Bila isi variabelnya OPERAND, maka langsung cetak variabel Operator kurung buka dan kurung tutup bisa disimpan ke Stack, namun tidak ditulis ke layar Bila isi variabelnya Kurung Buka ‘(‘, maka simpan (PUSH) Kurung Buka ke Stack. Bila isi variabelnya OPERATOR maka periksa : Bila Stack kosong, maka simpan Operator sekarang ke Stack Bila Stack paling atas berisi Operator selain tanda kurung, maka bandingkan derajat di Stack dengan variabel sekarang. Bila lebih rendah di Stack, maka variabel langsung di-PUSH Bila lebih tinggi di Stack, maka Stack paling atas di-POP / dicetak, kemudian variabel sekarang masuk/ di-PUSH.
ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Bila Stack paling atas isinya kurung buka ‘(’, maka variabel sekarang langsung di-PUSH/ disimpan ke Stack. Bila variabel sekarang isinya kurung tutup ‘)‘, maka cetak semua Operator di Stack hingga bertemu tanda kurung buka ‘(’. Bila variabel yang ada telah habis diproses dan Stack masih berisi, maka cetak semua Operator yang ada di dalam Stack hingga Stack kosong melomponk
+ - STACK / TUMPUKAN POSTFIX INFIX A - B + C A B - C + $ * / + - ( ) 4 3 2 1 PANGKAT $ KALI & BAGI * / TAMBAH & KURANG + - KURUNG BUKA & TUTUP ( ) T.Atas := 1 T.Atas := 0
STACK / TUMPUKAN A + (B / C) Contoh : Ubahlah notasi INFIX berikut ke notasi POSTFIX. A + (B / C) KARAKTER TUMPUKAN CETAK A + ( + ( B A B / + ( / C A B C ) + ( / ) A B C / A B C / +
ARRAY (LARIK) STACK / TUMPUKAN INFIX A + B – C A + B * C (A + B) * C A + B – C * D A + (B - C) * D (A + B) * (C - D) A – B / (C * D $ E) POSTFIX A B + C - A B C * + A B + C * A B + C D * - A B C - D * + A B + C D - * A B C D E $ * / -
ARRAY (LARIK) STACK / TUMPUKAN (A + B * C (D - E)) / ((F + G) / H) A – B + C * (D $ E / (F - G) + H) - I A B – C D E $ F G - / H + * + I -
ARRAY (LARIK) STACK / TUMPUKAN DEKLARASI AWAL STACK const MaxElemen = 255; type StringKata = string[MaxElemen]; Tumpukan = record Isi : StringKata; Atas : 0..MaxElemen; end; var Infix = StringKata; {*untuk menyimpan masukan*}
ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Penentuan Derajat Nilai dari Operator : {* Fungsi untuk mengembalikan nilai derajat dari operator *} function DERAJAT(Tanda_Op : char) : integer; begin case Tanda_Op of ‘$’ : DERAJAT := 3; {* Pangkat *} ‘*’ , ‘/’ : DERAJAT := 2; {* Kali & Bagi *} ‘+’ , ‘-’ : DERAJAT := 1; {* Tambah & Kurang *} ‘(’ : DERAJAT := 0; {* Kurung Buka *} end end;
ARRAY (LARIK) STACK / TUMPUKAN {* Prosedur PUSH *} procedure PUSH (var T : Tumpukan; Elemen = char); Begin T.Atas := T.Atas + 1; T.Isi[T.Atas] := Elemen; end; {* Fungsi POP -> untuk mengembalikan nilai POP *} function POP (var T : Tumpukan) : char; begin POP := T.Isi[T.Atas]; T.Atas := T.Atas - 1; end;
Prosedure INFIX ke POSTFIX : ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Prosedure INFIX ke POSTFIX : procedure KONVERSI_POSTFIX(Infix : StringKata); var I : integer Operator : set of char; Temp, Kar : char; T : Tumpukan; begin {* Deklarasikan Operator yang diijinkan *} Operator := [‘$’] + [‘*’] + [‘/’] + [‘+’] + [‘-’]; for I:=1 to length(Infix) do Kar := Infix(I);
Prosedure INFIX ke POSTFIX : ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Prosedure INFIX ke POSTFIX : {* Jika variabel adalah tanda ‘(’, maka PUSH ke Stack*} if Kar = ‘(’ then PUSH(T,Kar) {* Jika variabel adalah tanda ‘)’, maka POP dan tulis *} {* semua isi Stack hingga ketemu tanda ‘(’ *} else if Kar = ‘)’ then begin while T.Isi[T.Atas] <> ‘(’ do write(POP(T) : 2); Temp := POP(T) end
Prosedure INFIX ke POSTFIX : ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Prosedure INFIX ke POSTFIX : {*Jika variabel adalah tanda Operator selain tanda kurung} {*maka bandingkan operator di Stack dengan variabel *} else if Kar in Operator then begin while (T.Atas] <> 0) and (DERAJAT(Kar) <= DERAJAT(T.Isi[T.Atas])) do write(POP(T) : 2); PUSH(T,Kar) end {*Jika Operand, maka langsung di cetak} else if Kar <> ‘ ‘ then write(Kar : 2) end; {* Akhir dari perulangan FOR *}
Prosedure INFIX ke POSTFIX : ARRAY (LARIK) STACK / TUMPUKAN INFIX ke POSTFIX Prosedure INFIX ke POSTFIX : {*Jika Stack masih isi, POP / cetak semua isinya *} If T.Atas <> 0 then repeat write(POP(T) : 2) until T.Atas = 0; end; {* Akhir dari Procedure KONVERSI_POSTFIX *}
Tugas 4 (70 * 20) / (15 * 3) B $ 2 – (4 * A) * C Ubahlah notasi INFIX berikut ke notasi POSTFIX. (70 * 20) / (15 * 3) B $ 2 – (4 * A) * C (A – B / C + E) / (A + B) W + (5 * 30 + P / (5 $ 8))
Tugas 4 Contoh : Ubahlah notasi INFIX berikut ke notasi POSTFIX. (A + B) / C KARAKTER TUMPUKAN CETAK ( A + ( + B A B ) ( + ) A B + / C A B + C A B + C /
THE END OF THIS DAY KANGGOANG Biin NAAAHHH,,,,!!!! DEAL??? DEEEAAALLLL,,,,,