Struktur Data - Stack Sapta Candra Miarsa,S.T.,M.T. Aneka Struktur Data Struktur Data Kelebihan Kekurangan Array Penambahan data dibelakang lebih mudah dilakukan Ukuran tetap, penghapusan lambat, pencarian lama Array terurut Pencarian jauh lebih cepat dibanding array yang tidak terurut Ukuran tetap, penghapusan lambat, penyisipan lama Tumpukan (Stack) Penambahan dilaksanakan dengan cepat, akses terhadap data yang terakhir kali dimasukan bisa dilakukan dengan cepat Pencarian dan penghapusan lambat Antrian (Queue) Data yang pertama kali masuk mudah diakses Akses terhadap data lain lambat Senarai berantai Penyisipan dan penghapusan data mudah Pencarian lama Pohon biner (Binary tree) Pencarian dan penyisipan mudah Penghapusan kompleks Tabel hash Akses cepat bila kunci diketahui. Penyisipan cepat Akses pelan jika kunci tidak diketahui • Stack (tumpukan) adalah struktur data yang memungkinkan penyisipan dan pengambilan data dari satu ujung yang disebut puncak. C B A elemen 20 10 2 13 77 24 32 55 1 2 3 4 5 6 7 8 Index array (A) Stack (tumpukan) kosong C B A berisi 3 C B A diambil 1 dari puncak Stack memiliki sifat last in first out (LIFO), artinya data yang terakhir kali masuk adalah Menjadi data yang pertama kali keluar. Operasi Stack • Operasi dasar pada tumpukan berupa push dan pop. • Push adalah operasi untuk memasukkan data kedalam tumpukan. Push (T,d) T: menyatakan tumpukan, d: item data yang disisipkan ke dalam T • Pop adalah operasi untuk mengambil data dari tumpukan. Pop (T) Operasi yang dapat dilakukan stack • • • • • • Menambah (push) Mengambil (pop) megecek apakah stack penuh (isFull) mengecek apakah stack kosong (isEmpty) membersihkan stack (clear). Mencetak isi stack (print) Ilustrasi Push dan Pop Operasi Penjelasan Push( T, ‘Bantul’) Push( T, ‘Sleman’) Bantul dimasukkan terlebih dahulu baru Sleman Pop(T) Push( T, ‘Kulon Progo’) Sleman dikeluarkan, Kulon Progo dimasukkan Push(T, ‘Wonosari’) Push(T, ‘Sleman’) Wonosari dimasukkan, diikuti Sleman Hasil tumpukan Sleman Bantul Kulon Progo Bantul Sleman Wonosari Kulon Progo Bantul Pop(T) Pop(T) Pop(T) ? ? Operasi-operasi stack • Mendefinisikan Max untuk maksimum isi stack # define Max 50 # defive true 1 # define false 0 • Mendefinisikan stack Char stack [Max]; Init top; • Fungsi init : untuk inisialisasi atau membuat stack baru yang masih kosong. Void init (void) { top=-1; } • Fungsi Full : digunakan untuk mengecek apakah stack penuh. int full (void) { if (top==MAX-1) return (true); else return (false); } • Fungsi Empty : digunakan untuk mengecek apakah stack kosong. int empty (void) { if (top==-1) return (true); else return (false); } • Fungsi Clear : digunakan untuk mengosongkan stack. Stack dianggap kosong jika ujung atas stack pada posisi -1. Void clear (void) { top=-1; printf (“Stack telah dikosongkan\n”); } • Fungsi Push : digunakan untuk menambah data kedalam stack. Penambahan data tidak dapat dilakukan jika stack penuh. - Tambahkan nilai top. - Masukkan data pada posisi top. Void push (char info); { if (full ()!= true) { top++; stack[top]=info; } else printf (“Stack sudah penuh.. \n”); } • Fungsi pop : digunakan untuk mengeluarkan data teratas dari stack dengan syarat sebelumnya stack tidak boleh kosong. - Ambil data dari posisi top - Turunkan nilai top char pop (void); { char info; if (empty()!= true) { info=stack[top]; top--; return(info); } else printf (“Stack sudah kosong.. \n”); } Program konversi aritmatik mengubah bentuk INFIX ke PREFIX • Misalkan operasi: A + B - C • Operasi tersebut disebut dengan notasi infix, dan notasi infiks tersebut harus diubah terlebih dahulu menjadi notasi prefix • A + B - C notasi prefixnya : - + A B C A+B-C A+B-C Stack Stack Prefix + A A+B-C Prefix + AB A+B-C Stack Prefix + ABC Prefix -+A BC • • • • • • A+B-C Scan A Scan + Scan B Scan Scan C : stack (kosong) prefix (kosong ) : stack (kosong) prefix ( A ) : stack ( + ) prefix ( A ) : stack ( + ) prefix ( A B ) : stack ( + ) prefix ( A B ) : stack ( + ) prefix ( A B C ) • Karena sudah habis, push ToS stack ke Prefix • Prefix ( -+ABC ) Program konversi aritmatik mengubah bentuk INFIX ke POSTFIX • Misalkan operasi: 7 + 1* 8 • Operasi tersebut disebut dengan notasi infix, dan notasi infiks tersebut harus diubah terlebih dahulu menjadi notasi postfix • 7 + 1* 8 notasi postfiksnya : 718*+ Infix to Postfix 7+8*1 Stack Posftix • Lihat soal dari depan ke belakang • Jika operand, maka masukkan ke postfix • Jika operator, maka: ▫ Jika stack masih kosong, push ke stack • Jika semua soal sudah dibaca, maka pop semua isi stack dan push ke postfix dan sesuaikan dengan urutannya 7+8*1 7+8*1 Stack Stack Postfix + 7 Postfix * + 7+8*1 7+8*1 Stack Stack * + 78 Postfix Postfix 781 781*+ • • • • • • 7+8*1 Scan 7 Scan + Scan 8 Scan * Scan 1 : stack (kosong) postfix (kosong) : stack (kosong) postfix ( 7 ) : stack ( + ) postfix ( 7 ) : stack ( + ) postfix ( 7 8 ) : stack ( + * ) postfix ( 7 8 ) : stack ( + * ) postfix ( 7 8 1 ) • Karena sudah habis, push ToS stack ke Posfix • Postfix ( 7 8 1 * + ) Postfix Evaluator • • • ▫ • • • Scan Postfix string dari kiri kekanan. Siapkan sebuah stack kosong. Jika soal adalah operand, tambahkan ke stack. Jika operator, maka pasti akan ada minimal 2 operand pada stack Pop dua kali stack, pop pertama disimpan dalam y, dan pop kedua ke dalam x. Lalu evaluasi x <operator> y. Simpan hasilnya dan push ke dalam stack lagi. Ulangi hingga seluruh soal discan. Jika sudah semua, elemen terakhir pada stack adalah hasilnya. Jika lebih dari satu elemen, berarti error! Postfix 7 8 1*+ Stack * 1 8 7 * 1 8 7 + 8 7 15 + Y X 8+7=15 Y X 1*8=8 8 7 15