QUEUE Pertemuan ke-6 T 0026
Queue D C B A Bentuk khusus dari ordered list Data di insert di akhir list Data di delete di awal list A R F B C D
Elemen paling belakang Queue sebagai ADT Misal, queue Q terdiri dari n elemen Q = ( ao , a1 , … , ai , ai+1 , …, an-1 ) Elemen paling depan FRONT Elemen paling belakang REAR ao : elemen yang diinsert pertama kali an-1 : elemen yang diinsert terakhir
Representasi Queue Yang paling sederhana : array 1-D Disebut Sequential Queue 2 variabel indikator REAR dan FRONT #define MAX_QUEUE_SIZE 100 eltype queue[MAX_QUEUE_SIZE]; int rear = -1; int front = -1;
Aplikasi Queue dengan Array 1-D front rear Q[0] Q[1] Q[2] Q[3] Comments -1 Queue kosong J1 Masuk Job 1 1 J2 Masuk Job 2 2 J3 Masuk Job 3 Hapus Job 1 Hapus Job 2
Sequential Queue : Add Queue void addq (int *rear, eltype item) { if (*rear == MAX_QUEUE_SIZE-1) { printf (“Queue penuh\n”); return; } queue[++*rear] = item; /* indeks rear di-increment sebelum insert data baru */
Sequential Queue : Delete Queue eltype deleteq(int *front, int rear){ if (front == rear) { printf (“queue empty\n”); return; } return queue(++*front); /*indeks front di-increment sebelum passing nilai yang disimpan di queue */
Kekurangan Sequential Queue Setelah beberapa data insert dan delete dari queue, REAR dan FRONT bergerak ke kanan, hingga REAR mencapai MAX_QUEUE_SIZE-1. Jika REAR mencapai maksimum, queue akan dideteksi PENUH, meskipun beberapa lokasi di depan FRONT kosong. Solusi : elemen queue harus digeser ke depan shg FRONT=-1 dan REAR != MAX_QUEUE_SIZE-1 Tetapi perlu waktu untuk menggeser elemen satu persatu. Lebih baik gunakan circular array untuk queue
Circular Queue : Empty Empty : front = rear [0] [1] [2] [3] [4] [5]
Circular Queue : Full Full : front = (rear + 1) % MAX_QUEUE_SIZE [0] [1] [2] [3] [4] [5] J4 J5 J6 J7 J8 F R [0] [1] [2] [3] [4] [5] J1 J2 J3 J4 J5 F R Full : front = (rear + 1) % MAX_QUEUE_SIZE
Circular Queue : Insert [0] [1] [2] [3] [4] [5] J1 F R R [2] [3] J2 [1] J1 [4] [0] [5] F Insert : REAR berubah, FRONT tetap *rear = (*rear+1) % MAX_QUEUE_SIZE
Circular Queue : Delete [0] [1] [2] [3] [4] [5] J4 J5 J6 J7 J8 F R R [0] [1] [2] [3] [4] [5] J4 J5 J6 J7 J8 F Delete : FRONT berubah, REAR tetap *front = (*front+1) % MAX_QUEUE_SIZE
Circular Queue : Add Queue void addq(int front,int *rear, eltype item){ *rear = (*rear+1)%MAX_QUEUE_SIZE; if (front = *rear) { printf (“Queue full\n”); return; } queue[*rear] = item;
Circular Queue : Delete Queue eltype deleteq (int *front, int rear){ eltype item; if (*front == rear) { printf (“Queue empty\n”); return; } *front = (*front+1)%MAX_QUEUE_SIZE; return queue[*front];
Implementasi Queue dengan Single Linked-List front nama ip link nama ip link nama ip link Tono 3.8 Dewi 4.0 Ani 3.7 NULL rear Typedef struct elqueue { char name[10]; float ip; struct elqueue *link; }