Pertemuan ke-5(Stack)

Download Report

Transcript Pertemuan ke-5(Stack)

STRUKTUR DATA
PERTEMUAN 5
[email protected]
STACK / TUMPUKAN
ARRAY (LARIK)
• 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.
STACK / TUMPUKAN
ARRAY (LARIK)
OPERAND dan OPERATOR
OPERATOR
A + B * C
OPERAND
DERAJAT OPERATOR
PANGKAT
$
KALI & BAGI
* /
+ ( )
TAMBAH & KURANG
KURUNG BUKA & TUTUP
STACK / TUMPUKAN
ARRAY (LARIK)
INFIX
A+B
A+B*C
POSTFIX
AB +
ABC *+
PREFIX
+ AB
*+ 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.
STACK / TUMPUKAN
ARRAY (LARIK)
• 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.
STACK / TUMPUKAN
ARRAY (LARIK)
INFIX ke POSTFIX
1. Hanya OPERATOR yang disimpan ke Stack
2. Bila isi variabelnya OPERAND, maka langsung cetak variabel
3. Operator kurung buka dan kurung tutup bisa disimpan ke Stack, namun
tidak ditulis ke layar
4. Bila isi variabelnya Kurung Buka ‘(‘, maka simpan (PUSH) Kurung Buka ke
Stack.
5. Bila isi variabelnya OPERATOR maka periksa :
a. Bila Stack kosong, maka simpan Operator sekarang ke Stack
b. Bila Stack paling atas berisi Operator selain tanda kurung, maka
bandingkan derajat di Stack dengan variabel sekarang.
i. Bila lebih rendah di Stack, maka variabel langsung di-PUSH
ii. Bila lebih tinggi di Stack, maka Stack paling atas di-POP / dicetak,
kemudian variabel sekarang masuk/ di-PUSH.
STACK / TUMPUKAN
ARRAY (LARIK)
INFIX ke POSTFIX
iii.
iv.
v.
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
INFIX
A - B + C
POSTFIX
+
-
AB -C +
4
PANGKAT
$
3
KALI & BAGI
* /
2
TAMBAH &
KURANG
+ -
T.Atas := 1
1
KURUNG BUKA &
TUTUP
( )
T.Atas := 0
0
STACK / TUMPUKAN
Contoh :
Ubahlah notasi INFIX berikut ke notasi POSTFIX.
A + (B / C)
KARAKTER
TUMPUKAN
A
CETAK
A
+
+
A
(
+(
A
B
+(
AB
/
+(/
AB
C
+(/
ABC
)
+(/)
ABC
+
ABC/
ABC/+
STACK / TUMPUKAN
ARRAY (LARIK)
•
•
•
•
•
•
•
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
AB+CABC*+
AB+C*
AB+CD*ABC-D*+
AB+CD-*
ABCDE$*/-
STACK / TUMPUKAN
ARRAY (LARIK)
• (A + B * C (D - E)) / ((F + G) / H)
• ABCDE-*+FG+H//
• (A + B) / ((C - D) * E $ F) $ G - H
• AB+CD–EF$*G$/H• A – B + C * (D $ E / (F - G) + H) - I
• AB–CDE$FG-/H+*+I-
STACK / TUMPUKAN
ARRAY (LARIK)
DEKLARASI AWAL STACK
const
MaxElemen = 255;
type StringKata = string[MaxElemen];
Tumpukan = record
Isi : StringKata;
Atas : 0..MaxElemen;
end;
var
Infix = StringKata;
{*untuk menyimpan masukan*}
STACK / TUMPUKAN
ARRAY (LARIK)
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;
STACK / TUMPUKAN
ARRAY (LARIK)
{* 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;
STACK / TUMPUKAN
ARRAY (LARIK)
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
begin
Kar := Infix(I);
STACK / TUMPUKAN
ARRAY (LARIK)
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
STACK / TUMPUKAN
ARRAY (LARIK)
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 *}
STACK / TUMPUKAN
ARRAY (LARIK)
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
Ubahlah notasi INFIX berikut ke notasi POSTFIX.
1.
2.
3.
4.
(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
(
A
+
(+
A
B
(+
AB
)
(+)
AB
AB+
/
/
AB+
C
/
AB+C
AB+C/
• THE END OF THIS DAY
• KANGGOANG Biin NAAAHHH,,,,!!!!
DEAL???
DEEEAAALLLL,,,,,