Stack Stack adalah struktur data yang memiliki sifat last in first out. Struktur dari stack yang dapat kita lihat sehari-hari adalah : tumpukan (lihat gambar 1.1) Gambar 1.1 Stack Terdapat 2 (dua) operasi yang dapat dikerjakan dalam stack : push dan pop (lihat gambar 2.2). Push adalah operasi menambahkan data ke tumpukkan, sedangkan pop adalah operasi mengambil data yang menempati posisi teratas dari stack. Gambar 2.2a Operasi Push Pada Stack Gambar 2.2b Operasi Pop Pada Stack Gambar 2.2c Operasi Push dan Pop Pada Stack Gambar 2.2d Contoh Lengkap Operasi Stack Stack bisa dipakai untuk aplikasi delimiter check. Contoh delimiter {, [, (, ), ], }. Setiap pembuka delimiter harus mempunyai delimiter penutup. Contoh : a{bc[d]e}f(g) a{bc[d}e]f(g) BENAR SALAH Implementasi Stack Menggunakan Array Diandaikan jumlah tumpukan stack tidak akan melebihi K. Maka berikut ini adalah langkah-langkah implementasi stack menggunakan Array : 1. Buat array dengan nama S (array 1 dimensi) yang memiliki ukuran K S[K] 2. bagian top dari stack dinamakan h, diberi nilai awal = 0 3. Misal terjadi operasi push(x) : menambahkan elemen x ke dalam stack. maka terdapat dua proses yang terjadi : (3.1) S[h]=x (3.2) h++ 4. Jika terjadi operasi pop() : mengambil data teratas dari stack, maka terdapat dua proses yang terjadi : (4.1) h-(4.2) return S[h] 5. Top() : melihat data teratas dari stack, maka proses yang terjadi : (5.1) return S[h-1] 6. Empty() : Mengecek apakah stack dalam kondisi kosong ? (6.1) return (h==0) Setiap kali terjadi operasi, harus dilakukan pengujian terhadap batas dari array. Terdapat 2 (dua) kondisi yang terjadi : 1. Jika memasukkan data ke stack yang telah penuh, saat h=K maka terjadi Overflow 2. Jika mengambil data dari stack yang kosong, saat h<0 maka terjadi Underflow Penentuan Ukuran Stack Ukuran dari stack perlu diperhatikan. Ukuran yang ideal disesuaikan dengan kebutuhan pemakaian karena Jika ukuran stack yang disediakan sangat besar dibandingkan dengan stack yang terpakai maka terjadi kondisi wasting space (pemborosan tempat penyimpanan). Sedangkan jika ukuran stack yang disediakan lebih sedikit dibandingkan dengan yang dibutuhkan maka akan terjadi masalah kekurangan tempat penyimpanan. Implementasi Stack Menggunakan Alokasi Memori Dinamis dan Pointer Ide dasar dari implementasi ini adalah mengalokasikan memori saat dibutuhkan. Ada beberapa hal yang perlu diperhatikan berkaitan dengan implementasi ini : 1. penunjuk (pointer) head akan menunjuk ke data pertama. 2. Setiap data dalam stack disimpan dalam node 3. Setiap node memiliki 2 (dua) informasi penting yaitu data dan berikut 4. Pada saat awal, head berikan nilai NULL yang berarti belum ada data di dalam stack 5. Pada saat operasi pengecekan kosong atau tidaknya sebuah stack, maka perintah yang diberikan adalah : return (head == NULL) 6. Pada saat operasi memperoleh nilai teratas dari stac, maka perintah yang diberikan adalah : jika (stack tidak kosong) maka kembalikan data pada posisi teratas di dalam potongan bahasa C/C++, pernyataan di atas dituliskan sebagai berikut : if (!empty()) { return (head.data) } Fungsi Push Pada Stack Menggunakan Pointer void push(int x) { //buat node baru T = new struct_dari_node T.data = x T.berikut = head head = T } Fungsi Pop Pada Stack Menggunakan Pointer tipe_dari_data pop() { if(empty()) { return NULL } X = head.data T = head head = head.berikut delete T return X } Notasi Polish dan Stack Berikut ini adalah contoh mengubah bentuk infix menjadi postfix : Gambar 2.3 Mengubah Infix ke Postfix Dari Bentuk Postfix bisa dicari nilai dari sebuah pernyataan matematika, contoh : Gambar 2.5 Menghitung Nilai Pernyataan Matematika Antrian Antrian adalah struktur data yang memiliki sifat first in first out. Di dalam struktur data ini terdapat informasi head / front dan tail / rear, karena informasi head dan tail bersifat flexible, maka umumnya implementasi dari antrian menggunakan jika menggunakan list maka akan dijelaskan menggunakan konsep double link list. Pada penjelasan berikut ini, dipaparkan implementasi antrian menggunakan Array. Gambaran dari antrian ditunjukkan pada gambar 2.6 Gambar 2.6 Contoh Antrian Gambar 2.7 menunjukan contoh pengambahan data, proses Enqueue, ke dalam antrian. Gambar 2.7 Proses Enqueue Gambar 2.8 menunjukan contoh mengurangi data, proses dequeue, dari antrian Gambar 2.8 Proses Dequeue Operasi Pada Antrian Pada antrian terdapat beberapa operasi dasar yaitu : (1)empty : mengecek kosong tidaknya sebuah antrian (2)full : mengecek penuh tidaknya sebuah antrian (3)enqueue : menambahkan data ke dalam antrian (4)dequeue : mengambil data dari antrian Proses enqueue merupakan proses penulisan, proses write sedangkan proses dequeue merupakan proses pembacaan, proses read. kedua proses ini diharapkan bisa berjalan secara asynchronous. Berikut ini adalah algoritma dari proses write : Selama terdapat data yang akan ditulis maka : jika (full) maka tunggu sebentar jika tidak enqueue(x) Berikut ini adalah algoritma dari proses read : Jika (empty) maka tunggu sebentar jika tidak maka x = dequeue() Implementasi dari Antrian Menggunakan Array Terdapat beberapa hal penting berkaitan dengan menggunakan array : 1. Asumsi array yang digunakan berukuran K. 2. Ada dua penunjuk yang diperhatikan : tail dan head implementasi antrian K head tail Gambar 2.9 Implementasi Antrian Dengan Array Kondisi Saat Antrian Kosong head = 0 tail = 0 head tailGambar 2.10 Antrian Kosong Kondisi Saat Terjadi Penambahan Data X Data X akan ditambahkan pada posisi tail setelah itu tail akan digeser X head tail Gambar 2.11 Penambahan Data X Kondisi Saat Terjadi Pengambilan Data Dari Antrian Terdapat dua proses yang terjadi : ● Ambil data pada posisi head X Y Z W head ● tail perbaharui posisi head X Y head Z W tail Kondisi Saat Menambahkan Data dan Tail Berada Pada Posisi Terakhir X Y Z head tail tail = (tail+1) % K Y head Z X tail Kondisi Saat Mengambil Data dan Head Berada Pada Posisi Terakhir Y Z X head head = (head+1) % K tail Y Z X head tail Mendeteksi Kondisi Kosong dan Penuh Dari Antrian Kondisi Kosong dan Penuh dari antrian akan tercapai jika head == tail. Jadi Pertanyaannya adalah bagaimana mengetahui kondisi saat ini penuh atau kosong ? Teknik yang bisa ditempuh adalah sebagai berikut : Membuat sebuah variabel (misal num) sebagai indikator penuh atau kosong. Ketika terjadi proses enqueue, num = num + 1 Ketika terjadi proses dequeue, num = num – 1 Dengan cara yang demikian maka untuk mendeteksi penuh / kosong dilakukan sebagai berikut : kosong ? penuh ? head==tail DAN num==0 head==tail DAN num==K Implementasi Antrian Menggunakan Double Link List Konsep dari double link list adalah setiap data akan saling kait mengkait satu dengan yang lainnya. Dalam double link list terdapat juga dua penunjuk penting head dan tail. Gambaran dari double link list dapat dilihat pada gambar barikut : sebelumn ya X Head data Y berikut Z Tail Berikut ini adalah implementasi menggunakan double link list : (1)new head=NULL tail = NULL (2)empty return (head==NULL) (3)enqueue(x) buat node baru, misal T T.data = x T.sebelumnya = tail tail.berikut = T tail = T T.berikutnya = NULL (4)dequeue() if (head==NULL) { error (underflow) } X = head.data temp = head head = head.berikut delete temp return (X) beberapa fungsi penting dalam antrian