Struktur Organisasi Data 2 Bahan Ajar Perkuliahan Sistem informasi (S1) Manajemen Informatika (D3)
Stack Definisi: Stack (tumpukan) merupakan sebuah tempat penyimpanan data terstruktur yang pengisian dan pengambilan datanya dirancang berdasarkan algorithma LIFO (Last in First out). Stack adalah sebuah struktur data yang aksesnya bersifat sekuensial (berurutan).
Stack Analogi: Stack umumnya dianalogikan sebagai tumpukan balok. Dimana penambahan tumpukan serta pengambilan tumpukan hanya dapat dilakukan pada tumpukan teratas.
Universitas menjadi satisrevinU Stack Aplikasi: Aplikasi paling sederhana yang memanfaatkan stack yaitu aplikasi untuk membalik kata. Universitas menjadi satisrevinU Mekanisme “undo” pada aplikasi pengelola teks. Aplikasi untuk backtracking. Misalnya saat anda masuk ke dalam labirin. Ketika anda menemukan jalan buntu, maka anda harus mundur kembali ke tempat sebelumnya sampai menemukan jalan lain atau keluar dari labirin tersebut. Evaluasi ekspresi arithmatika: Penguraian (parsing) dan memadankan tanda kurung (Matching Parentheses) pada notasi infix. Konversi dari notasi infix menjadi notasi postfix dan sebaliknya. Evaluasi notasi postfix
Stack Implementasi: Stack umumnya diimplementasikan menggunakan Array atau Linked List. Minimal memiliki 4 buah fungsi/prosedur dasar, yaitu: Void Push (val) Data Pop () Data Peek () Bool isEmpty Head Penambahan data: Sisipkan Node baru sebagai Node pertama. Node baru menjadi Top Node yang menjadi Top sebelumnya, bergeser menjadi Node setelah Top yang baru. Top 1 2 3 4 Top Jumlah Elemen Array = 5 NULL
Stack Struktur / Bagian Stack: TOP NOEL Merupakan elemen paling atas dari stack. TOP dapat bertipe data apa pun. Jika stack S = [S0, S1, S2, S3, S4, …, ST-1], maka TOP = ST-1 NOEL Merupakan jumlah elemen yang tersimpan di dalam stack. NOEL merupakan integer dengan nilai ≥ 0. Jika NOEL = 0, maka stack tersebut dianggap kosong. Jika stack S = [S0, S1, S2, S3, S4, …, ST-1], maka NOEL = T. Jika terdapat NOEL elemen di dalam stack, maka elemen ke NOEL-1 merupakan TOP atau S [NOEL - 1] = TOP.
Stack Fungsi pada Stack: Create () Push () Peek () Pop () isEmpty () Digunakan untuk membuat stack baru yang masih kosong. Push () Digunakan untuk melakukan pengisian ke dalam stack. Peek () Digunakan untuk melihat data yang tersimpan sebagai TOP pada stack. Pop () Digunakan untuk mengeluarkan/mengambil data yang tersimpan sebagai TOP pada stack. isEmpty () Digunakan untuk menguji apakah stack kosong atau tidak kosong. IsFull () Digunakan untuk menguji apakah stack penuh atau tidak penuh. Clear () Digunakan untuk menghapus seluruh elemen dari stack.
Stack Implementasi pada Teknik Depth-First Search (DFS) DFS merupakan teknik pencarian pada struktur pohon (tree), yaitu dengan melihat jalur yang mungkin diambil dari awal sampai akhir atau yang dicari telah ditemukan. Algorithma: Buat Stack Buat poin jalur pilihan baru Telusuri jalur dengan melakukan push ke dalam stack Ketika tidak ditemukan dan stack tidak kosong Pop jalur dari dalam stack Cari jalur lain yang mungkin dilalui sampai yang terakhir Push jalur ke dalam stack Kembali
Stack Implementasi pada Teknik Evaluasi Ekspresi Aritmatika Penguraian (parsing) dan memadankan tanda kurung (matching parentheses) pada notasi infix. Konversi Notasi Infix menjadi Postfix dan sebaliknya.
Stack Penguraian (parsing) dan memadankan tanda kurung (matching parentheses) pada notasi infix. Alasan: Penguraian tanda kurung pada notasi infix perlu dilakukan, karena notasi infix menggunakan tanda kurung untuk membungkus ekspresi yang akan dihitung. Contoh Notasi Infix: 1 + ((2 + 3) * 4 + 5) * 6 terdapat 2 pasang tanda kurung yang harus diuraikan ketika melakukan perhitungan.
Stack Penguraian (parsing) dan memadankan tanda kurung (matching parentheses) pada Notasi Infix. Algorithma: Amati barisan elemen ekspresi dari kiri ke kanan satu per satu. Ketika baris ekspresi belum habis, lakukan pengujian ekspresi: Bila bertemu tanda kurung buka ‘(‘, maka push ‘(‘ Bila bertemu tanda kurung tutup ‘)’, maka periksa apakah stack kosong atau tidak? Bila kosong, maka terjadi error dimana terdapat ‘)’ tanpa pasangan tanda ‘(‘ di dalam stack. Jadikan ‘E’ sebagai keluaran Bila tidak kosong, maka pop dari dalam stack (terdapat sepasang tanda kurung lengkap / terdapat tanda buka dan tutup kurung). Jadikan ‘()’ sebagai keluaran. Jika baris ekspresi habis dan stack belum kosong, maka terjadi error dimana terdapat tanda ‘(‘ tanpa tanda ‘)’
Stack Penguraian (parsing) dan memadankan tanda kurung (matching parentheses) pada Notasi Infix. Contoh penggunaan algorithma: Ekspresi 1 + ( 2 3 ) * 4 5 6 Stack Output () Ekspresi 1 + ( 2 3 ) * 4 5 Stack Output () E Ekspresi 1 + ( 2 3 ) * 4 5 Stack Output () E
Stack Konversi Notasi Infix menjadi Postfix dan sebaliknya. Alasan melakukan konversi: Teknik evaluasi ekspresi aritmatika akan lebih mudah dilakukan pada notasi postfix, karena notasi postfix tidak mengandung tanda kurung yang harus diuraikan. Selain notasi postfix, juga terdapat sebuah notasi lain yang tidak membutuhkan tanda kurung, yaitu notasi yang dikenal dengan sebutan notasi prefix. Contoh Notasi Infix dalam bentuk Notasi Postfix: 1 + ((2 + 3) * 4 + 5) * 6 1 2 3 + 4 * 5 + 6 * + Contoh Notasi Infix dalam bentuk Notasi Prefix: 1 + ((2 + 3) * 4 + 5) * 6 + 1 * + * + 2 3 4 5 6
Stack Konversi Notasi Infix menjadi Postfix. Algorithma: Amati barisan ekspresi dari kiri ke kanan satu persatu. Jika ekspresi merupakan angka, maka jadikan ekspresi sebagai keluaran Jika ekspresi merupakan operator, maka: Jika stack kosong, maka push operator ke dalam stack. Jika stack tidak kosong, maka Pop TOP operator jika memiliki tingkat prioritas operator yang sama atau lebih tinggi daripada operator pada ekspresi dari dalam stack sebagai output, lakukan sampai bertemu ‘(‘ atau stack kosong (namun tidak melakukan pop pada tanda ‘)’), Push operator baru pada ekspresi ke dalam stack. Jika ekspresi merupakan ‘(‘, maka push ekspresi ke dalam stack. Jika ekspresi merupakan ‘)’, maka pop operator sebagai output sampai menemukan ‘)’. Jika stack kosong dan ‘)’ tidak ditemukan, maka terjadi error. Jika seluruh ekspresi telah diamati, maka pop seluruh ekspresi dari dalam stack. Tingkat prioritas operator dari yang terendah sampai tertinggi : ‘+’, ‘-’, ‘*’, ‘/’
Stack Konversi Notasi Infix menjadi Postfix. Contoh penggunaan algorithma: Ekspresi 1 + ( 2 3 ) * 4 5 6 Stack Output Aksi Stack push pop (a) (b) (a) Terjadi ‘pop’, karena dalam urutan prioritas operator ‘*’ (pada TOP) lebih tinggi dari operator ‘+’ (pada ekspresi). (b) Tidak terjadi ‘pop’, karena dalam urutan prioritas operator ‘+’ (pada TOP) lebih rendah dari operator ‘*’ (pada ekspresi). Infix 1 + ( ( 2 + 3 ) * 4 + 5 ) * 6 Postfix 1 2 3 + 4 * 5 + 6 * +
Stack Evaluasi Notasi Postfix. Algorithma: Amati ekspresi dari kiri ke kanan satu persatu. Sampai seluruh ekspresi selesai diamati: Jika ekspresi merupakan angka, maka push ekspresi ke dalam stack. Jika ekspresi merupakan operator, maka: Pop 2 operand dari dalam stack: Jika stack kosong sebelum pop, maka terjadi error. Jika jumlah elemen di dalam stack sebelum pop < 2, maka terjadi error. Lakukan perhitungan menggunakan operator pada ekspresi dengan 2 buah operand yang diambil dari stack. Push hasil perhitungan ke dalam stack Pop hasil proses perhitungan terakhir dari dalam stack sebagai output.
Stack Evaluasi Notasi Postfix. Contoh penggunaan algorithma: Ekspresi 1 2 3 + 4 * 5 6 Stack 20 25 150 151 Output Aksi Stack push pop Perhitungan 3 + 2 5 * 4 5 + 20 6 * 25 150 + 1 Hasil Infix 1 + ( ( 2 + 3 ) * 4 + 5 ) * 6 = 151 Postfix 1 2 3 + 4 * 5 + 6 * + = 151
Stack Konversi dari Notasi Postfix menjadi Notasi Infix. Algorithma: Amati ekspresi dari kiri ke kanan satu persatu. Sampai seluruh ekspresi selesai diamati: Jika ekspresi merupakan angka, maka push ekspresi ke dalam stack. Jika ekspresi merupakan operator, maka: Pop 2 operand dari dalam stack: Jika stack kosong sebelum pop, maka terjadi error. Jika jumlah elemen di dalam stack sebelum pop < 2, maka terjadi error. Lakukan penggabungan menggunakan operator pada ekspresi dengan 2 buah operand yang diambil dari stack. Jika operator pada ekspresi adalah ‘+’ atau ‘-’, maka bungkus hasil penggabungan dengan tanda kurung buka ‘(‘ di awal dan kurung tutup ‘)’ di akhir. Push hasil perhitungan ke dalam stack Pop hasil proses pembungkusan terakhir dari dalam stack sebagai output.
Stack Konversi dari Notasi Postfix ke Notasi Infix Contoh penggunaan algorithma: Ekspresi 1 2 3 + 4 * 5 6 Stack (2+3) (2+3)*4 ((2+3)*4+5) ((2+3)*4+5)*6 (1+((2+3)*4+5)*6) Output Aksi Stack push pop Proses Hasil (a) pembungkusan menggunakan tanda kurung hanya terjadi jika melakukan perhitungan dengan operator ‘+’ dan ‘-’ Postfix : 1 2 3 + 4 * 5 + 6 * + Infix : (1 + ( ( 2 + 3 ) * 4 + 5 ) * 6)