STACK ( TUMPUKAN ) Fajrizal
Stack ( Tumpukan ) dapat diartikan sbg : Suatu kumpulan data yang seolah-olah ada data yg diletakkan diatas data yg lain, yg bisa menyisipkan ( menambah ) data serta mengambil ( menghapus data ). Cara penggambaran stack : Operasi yg dpt dilakukan dalam stack : 1. Menyisipkan / menambahkan data pd ujung atas stack push 2. Menghapus / mengeluarkan data dr ujung atas stack pop Prinsip kerja stack adalah LIFO ( Last In First Out ) D Top C B A Bottom
Example : B A A A D C C B B A A Pop ( S ) Kondisi awal Stack 4 1 2 5 Push ( S, A ) A D Push ( S, D ) C Push ( S, C ) C Push ( S, C ) 3 6 B B Push ( S, B ) Push ( S, B ) A A
Latihan : Gambarkan keadaan stack utk operasi berikut ( diasumsikan keadaan awal stack kosong ), stack dapat menampung max 4 elemen berupa data NIM. a. Tambahkan 2 no NIM ke dalam stack yaitu ( 0631521001 & 0631521002 ) b. keluarkan 1 elemen dari stack c. Tambahkan 3 elemen berikutnya ke dalam stack dg data (0631521003 & 0631521004 & 0631521005 )
Penyajian awal Stack : Dalam Pascal dikenal type data terstruktur yg disebut ARRAY (LARIK). Dapat digunakan u menyajikan sebuah tumpukan. Tapi penyajian dg mengg. ARRAY adalah kurang tepat karena banyaknya elemen dalam array adalah statis. Sedangkan dalam tumpukan, banyaknya elemen dapat bervariasi ( dinamis ). Meskipun demikian, ARRAY dapat digunakan u menyajikan sebuah tumpukan dg anggapan bahwa banyaknya elemen max dari tumpukan tsb tidak akan melebihi batas max banyaknya elemen dalam array. Pada saat ukuran tumpukan = ukuran array, jika ditambahkan data baru akan menyebabkan “OVERFLOW”. Dengan demikian perlu adanya data tambahan u mencatat posisi ujung atas tumpukan.
Dengan kebutuhan ini, penyajian tumpukan dapat dilakukan dengan menggunakan type data terstruktur yang lain yaitu RECORD ( Rekaman ) yg terdiri dari 2 field : - Field 1 Digunakan u menyimpan elemen tumpukan yg bertype array - Field 2 Digunakan u mencatat posisi atas ujung tumpukan. Deklarasi STACK secara umum : const MaxElemen =255; type Tumpukan = record Isi : array[1..MaxElemen] of string; atas : 0..MaxElemen end; var T : Tumpukan;
Operasi PUSH : procedure PUSH ( var T : Tumpukan; X : string ); begin T.Atas :=T.Atas + 1; T.Isi[T.Atas] := X end; if T.Atas = MaxElemen then writeln ( ‘ TUMPUKAN SUDAH PENUH ‘ ) else end 1 2
procedure POP ( var T : Tumpukan); begin T.Atas :=T.Atas - 1 end; Operasi POP : procedure POP ( var T : Tumpukan); begin T.Atas :=T.Atas - 1 end; if T.Atas = 0 then writeln ( ‘ TUMPUKAN SUDAH KOSONG ‘ ) else end 1 2
PENULISAN UNGKAPAN NUMERIS DALAM STACK Salah satu aplikasi STACK adalah untuk menulis ungkapan dengan menggunakan notasi tertentu. Cara penulisan ungkapan dapat dilakukan dengan menggunakan : 1. Notasi INFIX Operator diletakkan diantara 2 operand ex : A+B dimana A,B sbg operand dan + sbg operator 2. Notasi PREFIX ( POLISH ) Operator diletakkan sebelum 2 operand disajikan ex : +AB 3. Notasi POSTFIX ( SUFFIX ) operator diletakkan setelah 2 operand disajikan ex : AB+
Contoh : ( dalam notasi infix ) DG METODE SUBSTITUSI Dalam penulisan ungkapan, khususnya ungkapan numeris seringkali digunakan tanda kurung u mengelompokkan bagian mana yg harus dikerjakan lebih dahulu. Dalam ungkapan2 yg rumit, pemakaian tanda kurung ini tidak bisa dihindari. “ Semakin rumit ungkapan maka semakin banyak dibutuhkan tanda kurung “. Hal ini membawa suatu konsekwensi bahwa penulisan tanda kurung itupun harus benar2 terhindar dari kesalahan. Contoh : ( dalam notasi infix ) DG METODE SUBSTITUSI 1. A + B x C Notasi Prefix Notasi Postfix xBC 1 BCx 1 +A1 2 A1+ 2 Latihan : 2. (A + B) x (C –(D ^ E)) 3. (A x B) – ( C + D ) / ( E x ( F – G ) ) 1 2
Algorithma Konversi dari Infix ke Postfix Langkah 0 ( Awal ) - Baca ungkapan dalam notasi infix, misalnya = S - Tentukan panjang ungkapan tersebut, misalnya N karakter - Siapkan sebuah tumpukan kosong & siapkan derajad masing2 operator, misalnya : ^ pangkat = bernilai 3 x , / = bernilai 2 + , - = bernilai 1 ) , ( = bernilai 0 Langkah 1 Dimulai dari I=1 sampai N, kerjakan langkah2 berikut a. R = S [ I ] b. Test nilai R, jika R adalah : operand : langsung ditulis kurung buka : push ke dalam tumpukan kurung tutup : pop dan tulis semua isi tumpukan sampai ujung tumpukan = ‘(‘. Pop juga tanda ‘(‘ ini, tapi tidak usah ditulis.
operator : jika tumpukan kosong, atau derajad R operator : jika tumpukan kosong, atau derajad R lebih tinggi dibanding derajad ujung tumpukan, push operator ke dalam tumpukan. Jika tidak, pop ujung tumpukan da tulis, kemudian ulangi pembandingan R ujung tumpukan. Kemudian R di push. Langkah 2 Jika akhir notasi infix telah tercapai, dan tumpukan masih belum kosong, pop semua isi tumpukan dan tulis hasilnya.
1. ( A + B ) x ( C – D ) N = 11 karakter Proses ke Karakter dibaca ( R ) Isi Stack Karakter tercatat Notasi Postfix terbentuk 1 2 3 4 5 6 7 8 9 10 11 ( A + B ) * C - D +( Kosong (* -(* AB AB+ AB+C AB+CD AB+CD- AB+CD-*
( K ^ ( L + M )) + ( N – O ) N = 15 karakter Proses ke Karakter dibaca Isi Stack Karakter tercatat Notasi Postfix terbentuk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ( K ^ L + M ) N - O ^( ( ^ ( + ( ^ ( ( ( Kosong ( + kosong KL KLM KLM + KLM +^ KLM +^ N KLM +^ NO KLM +^ NO- KLM +^ NO- +
2. (A + B) * (C – D) ^ E N = 13 karakter Proses ke Karakter dibaca ( R ) Isi Stack Karakter tercatat Notasi Postfix terbentuk 1 2 3 4 5 6 7 8 9 10 11 12 13 ( A + B ) * C - D ^ E +( Kosong (* -(* AB AB+ AB+C AB+CD AB+CD- AB+CD-* AB+CD-*E AB+CD-*E^
Cara Substitusi : Infix Postfix ( A x B ) x ( C – D ) 1. A*B 1. AB* 2. C-D 2. CD- 3. 1*2 3. 12* 4. AB*CD-* LATIHAN : A + B * C – D ^ E (A * B) – ( C + D ) / ( E * ( F – G )) 1 2 3
Algorithma Konversi dari Infix ke Prefix Langkah 0 ( Awal ) - Baca ungkapan dalam notasi infix, misalnya = S - Tentukan panjang ungkapan tersebut, misalnya N karakter - Siapkan sebuah tumpukan kosong & siapkan derajad masing2 operator, misalnya : $ pangkat = bernilai 3 x , / = bernilai 2 + , - = bernilai 1 ) , ( = bernilai 0 Langkah 1 Dimulai dari I=N sampai 1, kerjakan langkah2 berikut a. R = S [ I ] b. Test nilai R, jika R adalah : operand : langsung ditulis & simpan ke var T kurung tutup : push ke dalam tumpukan kurung buka : pop dan tulis semua isi tumpukan sampai ujung tumpukan = ‘)‘. Pop juga tanda ‘)‘ ini, tapi tidak usah ditulis.
operator : jika tumpukan kosong, atau derajad R operator : jika tumpukan kosong, atau derajad R lebih tinggi atau sama dibanding derajad ujung tumpukan, push operator ke dalam tumpukan. Jika tidak, pop ujung tumpukan dan tulis disimpan ke var T, kemudian ulangi pembandingan R ujung tumpukan. Kemudian R di push. Langkah 2 Jika akhir notasi infix telah tercapai, dan tumpukan masih belum kosong, pop semua isi tumpukan dan tulis hasilnya, kemudian simpan ke var T. Langkah 3 Baca data dalam variabel T, dimulai dari N sampai 1 dan tulis ke dalam notasi prefix.
( A + B ) x ( C – D ) N = 11 karakter Proses ke Karakter dibaca ( R ) Isi Stack Karakter tercatat Isi Variabel T ( Notasi Postfix ) Notasi Prefix terbentuk 1 2 3 4 5 6 7 8 9 10 11 12 13 ) D - C ( * B + A -) Kosong )* +)* DC DC- DC-B DC-BA DC-BA+ DC-BA+* *+AB-CD
SELESAIKAN : (A + B) * (C – D) ^ E A * B – ( C + D ) / ( E * ( F – G ) )
Proses ke Karakter dibaca ( R ) Isi Stack Karakter tercatat Notasi Postfix terbentuk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ( P - Q ) + R X S ^ T / (( U V W ( ( KOSONG ( X ^ ( X * ( ( / / ( ( / PQ PQ- PQ-R PQ-R+ PQ-R+S PQ-R+ST PQ-R+ST^ PQ-R+ST^* PQ-R+ST^*U PQ-R+ST^*UV PQ-R+ST^*UV/ PQ-R+ST^*UV// PQ-R+ST^*UV//W PQ-R+ST^*UV//W+