ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
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 dengan
mekanisme Last In First Out (LIFO).
•Satck merupakan tipe data abstrak
yang 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
StackStack
Operasi 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 7
typedef 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
StackStack
Masih ingat soal dibawah ini ?
Buat suatu program yang dapat memeriksa
apakah pasangan simbol kurung {} [] dan (),
sudah benar.
Contoh:
1. {[()][()]} benar
2. [{()]} salah
3. [{()()}] benar
4. {[())()]} salah
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
StackStack
int 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
StackStack
EVALUASI INFIX
Mendapatkan nilai dari suatu ekspresi numerik
yang ditulis dalam notasi Infix.
Contoh:
a.a. 2 + 3,2 + 3, hasilnya adalah 5hasilnya adalah 5
b.b. 2 + 3 * 5,2 + 3 * 5, hasilnya adalah 17hasilnya adalah 17
c.c. (2 + 3) * 5,(2 + 3) * 5, hasilnya adalah 25hasilnya adalah 25
d.d. (2 + 3) * (15 – 10),(2 + 3) * (15 – 10), hasilnya adalah 25hasilnya adalah 25
Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah
Notasi Infix, Postfix dan PrefixNotasi Infix, Postfix dan Prefix
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 PrefixNotasi Infix, Postfix dan Prefix
Latihan:
Lakukan konversi dari notasi Infix dibawah ini
ke 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 Postfix
Create Stack
Kosongkan string Postfix
Tambahkan simbol ‘)’ ke ujung string Infix
Push( ‘(’ )
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 / 86 + 2 * 2 + 72 / 8
String Infix:String Infix: (6 + 2) * (2 + 72 )/ 8(6 + 2) * (2 + 72 )/ 8
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 PostfixKonversi Infix ke Postfix
• Evaluasi PostfixEvaluasi Postfix
• SelesaiSelesai

More Related Content

Struktur data 03 (stack)

  • 1. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah BAGIAN IIIBAGIAN III
  • 2. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack
  • 3. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack •Sistem penyimpanan data dengan mekanisme Last In First Out (LIFO). •Satck merupakan tipe data abstrak yang banyak digunakan dalam Compiler, String processing dan berbagai algoritma untuk graph.
  • 4. 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
  • 5. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack Operasi 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.
  • 6. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack Implementasi Stack dengan Array #define pj_max 7 typedef char elemen_type; elemen_type Stack[pj_max]; int Top; void create() { Top = 0; }
  • 7. 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; }
  • 8. 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; }
  • 9. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack 0 0 0 0 0 0 TOP[0] [1] [2] [3] [4] [5] [6] Create( );
  • 10. 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);
  • 11. 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);
  • 12. 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
  • 13. 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.
  • 14. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack Masih ingat soal dibawah ini ? Buat suatu program yang dapat memeriksa apakah pasangan simbol kurung {} [] dan (), sudah benar. Contoh: 1. {[()][()]} benar 2. [{()]} salah 3. [{()()}] benar 4. {[())()]} salah
  • 15. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack int 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; }}
  • 16. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah StackStack EVALUASI INFIX Mendapatkan nilai dari suatu ekspresi numerik yang ditulis dalam notasi Infix. Contoh: a.a. 2 + 3,2 + 3, hasilnya adalah 5hasilnya adalah 5 b.b. 2 + 3 * 5,2 + 3 * 5, hasilnya adalah 17hasilnya adalah 17 c.c. (2 + 3) * 5,(2 + 3) * 5, hasilnya adalah 25hasilnya adalah 25 d.d. (2 + 3) * (15 – 10),(2 + 3) * (15 – 10), hasilnya adalah 25hasilnya adalah 25
  • 17. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Notasi Infix, Postfix dan PrefixNotasi Infix, Postfix dan Prefix 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
  • 18. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Notasi Infix, Postfix dan PrefixNotasi Infix, Postfix dan Prefix Latihan: Lakukan konversi dari notasi Infix dibawah ini ke 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)
  • 19. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Operand dan OperatorOperand dan Operator A + B * C Operator O p e r a n d
  • 20. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Konversi Infix ke PostfixKonversi Infix ke Postfix Create Stack Kosongkan string Postfix Tambahkan simbol ‘)’ ke ujung string Infix Push( ‘(’ ) 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.
  • 21. 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.
  • 22. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah PrecedencePrecedence Keterangan: ‘^’ = Tanda pangkat Bila operator tidak terdefinisi, maka nilainya False, contoh: Prcd(’(’ , ’+’)= False.
  • 23. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Konversi Infix ke postfixKonversi Infix ke postfix ContohContoh:: String Infix:String Infix: 6 + 2 * 2 + 72 / 86 + 2 * 2 + 72 / 8 String Infix:String Infix: (6 + 2) * (2 + 72 )/ 8(6 + 2) * (2 + 72 )/ 8
  • 24. 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.
  • 25. Copyright Sunarya D. MarwahCopyright Sunarya D. Marwah Evaluasi InfixEvaluasi Infix Tidak bisa langsung.Tidak bisa langsung. Harus melalui:Harus melalui: • Konversi Infix ke PostfixKonversi Infix ke Postfix • Evaluasi PostfixEvaluasi Postfix • SelesaiSelesai