Struktur data 03 (stack)
-
Upload
sunarya-marwah -
Category
Documents
-
view
563 -
download
11
Transcript of Struktur data 03 (stack)
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
BAGIAN IIIBAGIAN III
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
•Sistem penyimpanan data denganmekanisme Last In First Out (LIFO). •Satck merupakan tipe data abstrakyang banyak digunakan dalam Compiler, String processing dan berbagai algoritma untuk graph.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
TOP
D merupakan elemen yang terakhir masuk
dan akan menjadi elemen yang pertama
keluar
A
B
C
D
PUSH PULL
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStackOperasi dalam Stack
1. Create( ) Menciptakan Stack baru dalam keadaan kosong.2. Push(e) Memasukkan data baru dari variabel e kedalam
Stack.3. Pull(*e) Mengambil data dari Stack untuk disimpan di
variabel e.4. Empty( ) Memeriksa apakah Stack dalam keadaan kosong.5. Full( ) Memeriksa apakah Stack dalam keadaan penuh.6. Clear( ) Menghapus semua data yang ada dalam Stack.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
Implementasi Stack dengan Array
#define pj_max 7typedef char elemen_type;elemen_type Stack[pj_max];int Top;
void create(){ Top = 0; }
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
int full(){ if (Top == pj_max-1) return 1; else return 0;}
int empty(){ if (Top == 0) return 1; else return 0;}
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
void Push(elemen_type e){ if (!full){Top++; Stack[Top] = e;};}
void Pull(elemen_type *e){ if (!empty){*e = Stack[Top]; Top--;};}
void clear(){ Top = 0;}
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
0
0
0
0
0
0
TOP[0]
[1]
[2]
[3]
[4]
[5]
[6]
Create( );
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
0
0
0
90
70
30
TOP
0
0
0
90
70
30
TOP
0
0
35
90
70
30
TOP
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
Sebelum Push TOP++ Stack[TOP] = e
Proses Push(35);
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
0
0
35
90
70
30
TOP
0
0
35
90
70
30
TOP
0
0
35
90
70
30
TOP
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
Sebelum Pull *e = Stack[TOP] TOP--
Proses Pull(*e);
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
Implementasi Stack dengan Linked list
• Operasi Push() menggunakan Insert Depan
• Operasi Pull() menggunakan Delete dibagian Head
• Pointer Head berfungsi sebagai TOP
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
Dibandingkan dengan implementasi Stack dengan array, implementasi Stack dengan linked list mempunyai:
Keuntungan:
1. Kapasitas Stack hanya dibatasi oleh kapasitas memori komputer.2. Penggunaan memori tergantung dari banyaknya data.
Kerugian:
1. Operasi Clear memerlukan lebih banyak langkah.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStackMasih ingat soal dibawah ini ?
Buat suatu program yang dapat memeriksa
apakah pasangan simbol kurung {} [] dan (),
sudah benar. Contoh:
1. {[()][()]} benar2. [{()]} salah3. [{()()}] benar4. {[())()]} salah
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStackint Setangkup(char StrKurung[])int Setangkup(char StrKurung[]){{ int L,I,S; char X;int L,I,S; char X; L = strlen(StrKurung); I=0; S=true;L = strlen(StrKurung); I=0; S=true; CreateStack();CreateStack(); dodo {{ switch (StrKurung[I])switch (StrKurung[I]) {{ case '(' : Push(StrKurung[I]); break;case '(' : Push(StrKurung[I]); break; case '[' : Push(StrKurung[I]); break;case '[' : Push(StrKurung[I]); break; case '{' : Push(StrKurung[I]); break;case '{' : Push(StrKurung[I]); break; case ')' : Pop(&X); if (X != '(') S = false; break;case ')' : Pop(&X); if (X != '(') S = false; break; case ']' : Pop(&X); if (X != '[') S = false; break;case ']' : Pop(&X); if (X != '[') S = false; break; case '}' : Pop(&X); if (X != '{') S = false; break;case '}' : Pop(&X); if (X != '{') S = false; break; }} I++;I++; } while (S && I<L);} while (S && I<L); if (!EmptyStack()) S=false;if (!EmptyStack()) S=false; return S;return S;}}
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStackEVALUASI INFIX
Mendapatkan nilai dari suatu ekspresi numerik
yang ditulis dalam notasi Infix.
Contoh:
a.a. 2 + 3, 2 + 3, hasilnya adalah hasilnya adalah 55
b.b. 2 + 3 * 5,2 + 3 * 5, hasilnya adalah hasilnya adalah 1717
c.c. (2 + 3) * 5, (2 + 3) * 5, hasilnya adalah 25hasilnya adalah 25d.d. (2 + 3) * (15 – 10),(2 + 3) * (15 – 10), hasilnya adalah hasilnya adalah
2525
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Notasi Infix, Postfix dan Notasi Infix, Postfix dan PrefixPrefix
Notasi InfixNotasi Infix Notasi PostfixNotasi Postfix Notasi PrefixNotasi Prefix
A + BA + B A B +A B + + A B+ A B
A + B * CA + B * C A B C * +A B C * + + A * B C+ A * B C
(A+B)*(C-D)(A+B)*(C-D) AB+CD-*AB+CD-* *+AB-CD*+AB-CD
(A + B) * C(A + B) * C A B + C *A B + C * * + A B C* + A B C
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Notasi Infix, Postfix dan Notasi Infix, Postfix dan PrefixPrefix
Latihan:
Lakukan konversi dari notasi Infix dibawah inike notasi Prefix dan notasi Postfix.
1. A + B x C + D / E
2. A * (R + (C – D)) * (E – F) + T
3. (B * B – 4 * A * C) / (2 * A)
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Operand dan OperatorOperand dan Operator
A + B * C
Operator
O p e r a n d
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Konversi Infix ke PostfixKonversi Infix ke PostfixCreate StackKosongkan string PostfixTambahkan simbol ‘)’ ke ujung string InfixPush( ‘(’ )While (Not Empty Stack){ Baca simbol dari string Infix Switch (simbol) { case operand: Tambahkan simbol ke ujung string Postfix case operator: While (prcd(Stack[Top], simbol) == true) { Pop(X) Tambahkan X ke ujung string Postfix } Push(simbol) case ‘(‘ : Push(simbol) case ‘)’ : While (Stack[Top] != ‘(‘ ) { Pop(X) Tambahkan X ke ujung string Postfix } Pop(X) // Buang simbol ‘(‘ } // akhir dari Switch } // akhir dari While Selesai.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
PrecedencePrecedence
Operator Nilai
Prcd(’^’ , ’x’) True
Prcd(’x’ , ’+’) True
Prcd(’x’ , ’x’) True
Prcd(’+’ , ’+’) True
Prcd(’+’ , ’-’) True
Prcd(’-’ , ’-’) True
Prcd(’x’ , ’^’) False
Prcd(’+’ , ’x’) False
Prcd(’-’ , ’+’) False
Prcd(’-’ , ’x’) False
dst.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
PrecedencePrecedence
Keterangan:
‘^’ = Tanda pangkat
Bila operator tidak terdefinisi, maka nilainya False, contoh:
Prcd(’(’ , ’+’)= False.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Konversi Infix ke postfixKonversi Infix ke postfix
ContohContoh::
String Infix:String Infix: 6 + 2 * 2 + 72 / 8 6 + 2 * 2 + 72 / 8
String Infix:String Infix: (6 + 2) * (2 + 72 )/ (6 + 2) * (2 + 72 )/ 88
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Evaluasi PostfixEvaluasi Postfix
1. Scan string Postfix dari kiri ke kanan.2. Bila ketemu operand, Push(operand).3. Bila ketemu operator,
3.1. Pop dua kali yaitu Pop(X) dan Pop(Y).3.2. Z = Y operator X.3.3. Push(Z).
4. Ulangi 2 s/d 3.3 hingga seluruh simbol didalam string terbaca.
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Evaluasi InfixEvaluasi Infix
Tidak bisa langsung.Tidak bisa langsung.
Harus melalui:Harus melalui:
• Konversi Infix ke Konversi Infix ke
PostfixPostfix
• Evaluasi PostfixEvaluasi Postfix
• SelesaiSelesai