Transcript queue
Queue 3. Queue (Antrian) 3.1. Definisi Queue (Antrian) adalah list linier yang : 1. Dikenali elemen pertama (Head) dan elemen terakhirnya (Tail) 2. Aturan penyisipan dan penghapusan elemennya disefinisikan sebagai berikut : - Penyisipan selalu dilakukan setelah elemen terakhir - Penghapusan selalu dilakukan pada elemen pertama 3. Satu elemen dengan elemen lain dapat diakses melalui informasi Next Struktur data ini banyak dipakai dalam informatika misalnya untuk merepresentasi : 1. Antrian job dalam sistem operasi 2. Antrian dalam dunia nyata Maka secara lojik, sebuah Queue dapat digambarkan sebagai list linier yang setiap elemennya adalah : Type ElmtQ = record <Info : InfoType, Next : address > dengan InfoType terdefinisi yang menentukan informasi yang disimpan pada setiap elemen queue, dan address adalah “alamat” dari elemen Selain itu alamat elemen Pertama (Head) dan elemen terakhir (Tail) dicatat. FIFO (First In First Out) rpos 0 spos 1 2 elemen queue isi antrian Setiap elemen memiliki index rpos menunjukkan index elemen yang siap diambil spos menunjukkan index yang siap ditempati elemen antrian berikutnya STORE (S), memasukkan elemen RETRIEVE (R), mengambil elemen elemen FIFO (First In First Out) 0 1 2 STORE, memasukkan elemen RETRIEVE, mengambil elemen rpos: 0 0 1 2 spos: spos: 0 spos: 1 spos: 2 3 STOR E rpos: 0 rpos: 1 rpos: 2 rpos: 3 RETRIEV E 0 1 2 spos: 3 Queue Buat array untuk queue Buat variabel bertipe int untuk rpos dan spos Contoh: #define MAX 20 int queue[MAX]; int rpos; int spos; Fungsi STORE Masukkan elemen ke queue dengan index spos sekarang queue[top] = elemen; Naikkan / tambahkan nilai spos dengan 1 spos++ ; Fungsi RETRIEVE Naikkan / tambahkan nilai rpos dengan 1 rpos++; Kembalikan nilai queue pada index rpos sekarang return queue[rpos]; Memutar nilai spos kembali ke 0 ketika sudah mencapai nilai MAX Memutar nilai rpos kembali ke 0 ketika sudah mencapai nilai MAX Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list Front : untuk menunjuk pengantri paling depan (front = depan) Rear : untuk menunjuk pengantri yang paling belakang (Rear =belakang) ENQUEUE 1 front==rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list Front : untuk menunjuk pengantri paling depan (front = depan) Rear : untuk menunjuk pengantri yang paling belakang (Rear =belakang) ENQUEUE 1 front 2 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 5 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi ENQUEUE: menambahkan data pada sebuah list ENQUEUE 1 front 2 3 4 5 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 1 front 2 3 4 5 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 2 front 3 4 5 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 3 front 4 5 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 4 front 5 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 5 front 6 rear Queue Penambahan data dilakukan pada sebuah ujung sebuah list, sedangkan penghapusan data dilakukan pada ujung yang lain Data yang dihapus adalah data yang paling awal ditambahkan Nama lain: FIFO (First In First Out) Operasi DEQUEUE: menghapus data pada sebuah list DEQUEUE 6 front==rear Animasi Queue ENQUEUE dan DEQUEUE Implementasi Queue • Implementasi queue lebih sulit daripada stack. Pada stack, penambahan dan penghapusan data hanya dilakukan pada satu ujung saja, sehingga cukup mengubah posisi pointer sesuai dengan penambahan/pengurangan data • Implementasi queue, harus mengubah posisi DUA buah pointer, yaitu pointer yang menunjuk ke FRONT, dan pointer yagn menunjuk ke REAR • Ada dua cara implementasi queue: rear stack front queue Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 ujung depan … ujung belakang Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT front Array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT rear front Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Cara 1 • Tempatkan data pada sebuah array, dan setlah pointer agar menunjuk ke posisi FRONT dan REAR • Saat data ditambahkan ke queue, naikkan posisi pointer REAR • Saat data dihapus dari queue, naikkan posisi pointer FRONT • Saat front==rear, berarti queue kosong front==rear Array x … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Queue adalah pada bagian yang berwarna hijau Masalah yang timbul pada Cara 1 Front dari rear selalu bertambah secara motononik, sehingga memerlukan array dengan ukuran tak terhingga front array x … rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Pointer selalu bergerak ke kanan, tak pernah kembali Menyambungkan FRONT dan REAR dari array itu sehingga membentuk cincin (RING BUFFER) Cara 1 n-2 n-1 rear 0 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear 1 front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 rear 0 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear 1 front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 rear n-1 0 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear 1 front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 0 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear 1 rear front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 0 1 rear • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 0 1 rear • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 0 1 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear rear front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 rear n-1 0 1 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear front Queue adalah pada bagian yang berwarna hijau Cara 1 n-2 n-1 0 1 • Array dibuat seperti cincin, dimana elemen terakhir disambungkan dengan elemen pertama • Menambahkan data ke queue: nilai rear dinaikkan satu • Menghapus data dari queue: nilai front dinaikkan satu • Queue kosong pada saat front==rear rear==front Queue adalah pada bagian yang berwarna hijau Masalah pada Ring Buffer • Pada saat rear==front , ada dua interpretasi yang muncul, “queue kosong” ataukah “queue full” n-2 n-1 0 1 n-2 n-1 empty rear==front 0 1 full rear==front Queue adalah pada bagian yang berwarna hijau Masalah pada Ring Buffer • Solusi – Menyiapkan sebuah FLAG untuk memberi tanda kalau queue kosong – Queue dijaga agar tidak pernah full, dengan menyisakan sebuah elemen yang kosong n-2 n-1 0 1