Struktur data 03 (stack)

Post on 14-Jun-2015

563 views 11 download

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