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 spos 1 2 elemen queue
Keterangan elemen 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
Ilustrasi FIFO (First In First Out) 1 2 7
Operasi Dasar STORE, memasukkan elemen RETRIEVE, mengambil elemen 8
Ilustrasi rpos: 0 STORE 1 2 spos: 0 spos: 1 spos: 2 spos: 3 9
Ilustrasi rpos: 0 rpos: 1 rpos: 2 rpos: 3 RETRIEVE 1 2 spos: 3 10
Deklarasi Queue Buat array untuk queue Buat variabel bertipe int untuk rpos dan spos Contoh: #define MAX 20 int queue[MAX]; int rpos; int spos;
Deklarasi Fungsi STORE Masukkan elemen ke queue dengan index spos sekarang queue[top] = elemen; Naikkan / tambahkan nilai spos dengan 1 spos++ ;
Deklarasi Fungsi RETRIEVE Naikkan / tambahkan nilai rpos dengan 1 Kembalikan nilai queue pada index rpos sekarang return queue[rpos];
Queue dengan Circular Array 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 2 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 ENQUEUE 1 2 3 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 ENQUEUE 1 2 3 4 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 ENQUEUE 1 2 3 4 5 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 ENQUEUE 1 2 3 4 5 6 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 DEQUEUE: menghapus data pada sebuah list DEQUEUE 1 2 3 4 5 6 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 DEQUEUE: menghapus data pada sebuah list DEQUEUE 2 3 4 5 6 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 DEQUEUE: menghapus data pada sebuah list DEQUEUE 3 4 5 6 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 DEQUEUE: menghapus data pada sebuah list DEQUEUE 4 5 6 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 DEQUEUE: menghapus data pada sebuah list DEQUEUE 5 6 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 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 front stack 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 rear … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 … x3 x4 x5 x6 x7 x8 x9 x10 x11 x11 x12 … Array x 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 Menyambungkan FRONT dan REAR dari array itu sehingga membentuk cincin (RING BUFFER) front rear x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 array x … Pointer selalu bergerak ke kanan, tak pernah kembali
Cara 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 n-1 n-2 1 front rear Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 front rear Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 rear front Queue adalah pada bagian yang berwarna hijau
Cara 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 n-1 n-2 1 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-1 n-1 n-2 1 n-2 1 empty full rear==front 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-1 1 n-2