QUEUE (antrian)
Materi Mempelajari tipe data queue dan bagaimana menggunakan fungsi insert, remove, is_empty dan is_full. Mempelajari bagaimana mengimplementasikan queue dengan array.
Konsep Queue adalah tipe data abstrak (ADT) yang bersifat FIFO (First In First Out); FIFO = data yang pertama kali masuk akan dikeluarkan yang pertama kali juga. Data baru akan dimasukkan lewat ujung belakang, sedangkan data lama dikeluarkan lewat ujung depan. Queue bisa diimplementasikan dengan menggunakan array atau linked list. Model queue ada yang single direction dan ada yang circular track
Aplikasi Untuk mengatur proses dalam sebuah system sesuai dengan urutannya proses dalam sistem computer, printer job spooler, winamp file play list Simulasi dan modeling Air port, traffic/ lalu lintas, client – server, bank Predicting performance berdasar model dan simulasi kasir swalayan, toko
Fungsi Dasar Inisialisasi queue menjadi empty queue. Menentukan apakah queue dalam keadaan Kosong, Is_Empty. Menentukan apakah queue dalam keadaan Penuh, Is_Full. Jika queue belum penuh, Insert data baru ke bagian ujung pangkal queue. Jika queue tidak kosong, Remove data dari bagian ujung depan queue.
Implementasi Queue dengan Array
Contoh Inisialisasi queue : jumlah=0, depan =0, belakang=0 depan 2. Insert ‘A’ jumlah=1, depan =0, belakang=1 B 3. Insert ‘B’ jumlah=2, depan =0, belakang=2 C 4. Insert ‘C’ jumlah=3, depan =0, belakang=3
Contoh 5. remove jumlah=2, depan =1, belakang=3 depan belakang 7. Insert ‘D’ jumlah=2, depan =2, belakang=4 E 8. Insert ‘E’ jumlah=3, depan =2, belakang=5
Visualisasi Jumlah ? Depan ? Belakang ? D K P O T R W Y a b c d e f g
Algoritma Inisialisasi Inisialisasi digunakan untuk membuat queue dengan cara memberikan nilai awal dari setiap komponen queue. Inisialisasi set jumlah=0 set depan=0 set belakang=0
Algoritma Insert Bertujuan untuk memasukkan data ke queue. Data yang dimasukkan disimpan di posisi belakang queue Remove jika jumlah==ukuran maksimum queue cetak ERROR : queue sudah penuh else letakkan data ke queue posisi belakang increment belakang increment jumlah
Algoritma Remove Bertujuan untuk mengeluarkan data dari queue. Data yang dikeluarkan adalah data di posisi depan. Remove jika jumlah==0 cetak ERROR : queue sudah kosong else x = data queue pada indeks depan increment depan decrement jumlah
Algoritma Is_Empty Menyatakan apakah queue dalam keadaan kosong, dapat diketahui dari variabel jumlah. Is_Empty if jumlah=0 return TRUE else return FALSE
Algoritma Is_Full Menyatakan apakah queue dalam keadaan kosong, dapat diketahui dari variabel jumlah. Is_Full if jumlah == ukuran maksimum queue return TRUE else return FALSE
Deklarasi Struktur Data #define maxsize 100 // mendefinisikan maks ukuran data // dlm queue typedef struct { int jumlah; int depan; int belakang; char items [ maxsize ]; // array } queue; // nama tipe data baru yg dibuat adalah queue
Deklarasi Fungsi Queue void initialize (queue *q) void remove(queue *q, char *x ) void insert(queue *q, char x ) void show (queue *q) int Is_Empty(queue *q) int Is_Full(queue *q)
Fungsi Initialize void initialize ( queue *q ) { q -> jumlah = 0; // jumlah=0, queue dalam kondisi kosong q -> depan = 0; q -> belakang = 0; }
Fungsi Insert void insert (queue *q, char x ) { if ( q -> jumlah = = maxsize ) printf(“\nERROR: queue sudah penuh\”); else { // copy X ke array queue q -> data [ q -> belakang ] = x; q -> belakang = ( q -> belakang + 1 ); ++ ( q -> jumlah ); }
Fungsi Remove void remove ( queue *q, char *x ) { if ( q -> jumlah = = 0 ) printf(“\nERROR: queue sudah kosong\”); else { *x = q -> data [ q -> depan ]; q -> depan = ( q -> depan + 1 ); -- ( q -> jumlah ); }
Fungsi Is_Empty int Is_Empty ( queue *q ) { if ( q -> jumlah == 0 ) // jumlah = 0 queue kosong return(1); else return(0); }
Fungsi Is_Full int penuh ( queue *q ) { if ( q -> jumlah == maxsize ) // jumlah = maxsize queue penuh return(1); else return(0); }
Fungsi Show void show (queue *q) { printf("\nISI QUEUE :\n"); for(int i=q->depan; i>=q->belakang; i++) printf("\t%c\n", q->data[i]); printf("\n"); }
Fungsi Main void main() { queue *my_queue, q; char item, *x; x = &item; initialize(my_queue); insert(my_queue, 'A'); insert(my_queue, 'R'); insert (my_queue, 'I'); insert(my_queue, 'F'); show(my_queue); remove(my_queue, x); remove(my_queue, x); remove (my_queue, x); remove(my_queue, x); }
Queue menggunakan array depan belakang Q U E depan belakang depan belakang Q U E A Q U E depan belakang Lanjutkan sampai belakang = maxsize Apakah Queue full?
Queue menggunakan array depan belakang A Q U E Isi queue di shift ke awal array Tidak Efisien !!!
A circular array 2 MaxSize - 3 1 MaxSize - 2 MaxSize - 1
A queue using a circular array MaxSize - 1 belakang depan
A queue using a circular array T MaxSize - 1 belakang depan Tambah ‘T’ pada belakang belakang = belakang + 1
A queue using a circular array T H MaxSize - 1 belakang depan Tambah ‘H’ at belakang belakang = belakang +1
A queue using a circular array T H MaxSize - 1 belakang depan I Tambahkan ‘I’ at belakang belakang = belakang +1
A queue using a circular array MaxSize - 1 belakang depan E U Q A MaxSize = 16 Lanjutkan sampai belakang MaxSize-1
A queue using a circular array MaxSize - 1 belakang =? depan E U Q A Z MaxSize = 16 Tambah Z ke belakang belakang = belakang + 1 = 16 = MaxSize
A queue using a circular array Tambahkan ‘Z’ pada belakang belakang = (belakang +1) mod MaxSize MaxSize - 1 belakang depan E U Q A Z MaxSize = 16
1 2 3 4 5 MaxSize = 6 A B Head Tail Add to Q
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1)
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (4 + 1) mod 6
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (4 + 1) mod 6 tail = 5 mod 6
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (4 + 1) mod 6 tail = 5 mod 6 How many times does 6 go into 5? 5/6 = 0 rem 5
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (4 + 1) mod 6 tail = 5 mod 6 How many times tail = 5 does 6 go into 5? 5/6 = 0 rem 5
1 2 3 4 5 MaxSize = 6 A B C Head Tail Add to Q
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1)
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) tail = 5 + 1 tail = 6 !
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1)
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (5 + 1) mod 6
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (5 + 1) mod 6 tail = 6 mod 6
1 2 3 4 5 MaxSize = 6 A B C D Head Tail Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (5 + 1) mod 6 tail = 6 mod 6 How many times does 6 go into 6? 6/6 = 1 rem 0
1 2 3 4 5 MaxSize = 6 A B C D Tail Head Add to Q Add data at tail Increment tail tail = (tail + 1) mod MaxSize tail = (5 + 1) mod 6 tail = 6 mod 6 How many times tail = 0 does 6 go into 5? 5/6 = 0 rem 5
PRIORITY QUEUE
Priority Queue Pengembangan dari konsep queue, dimana setiap data dalam queue memiliki prioritas. Dikatakan “priority queue” karena dapat memberikan data tidak berdasarkan waktu insert, tetapi berdasarkan prioritas tertinggi. Aplikasi : agenda kegiatan kamus
Deklarasi Struktur Data #define maxsize 100 // mendefinisikan maks ukuran data // dlm queue typedef struct { int jumlah; int depan; int belakang; char data[maxsize]; int priority[maxsize]; }queue; // nama tipe data baru yg dibuat adalah queue
Deklarasi Fungsi Queue void initialize ( queue *q ); int kosong ( queue *q ); int penuh ( queue *q ); void insert ( queue *q, char X , int Y); void remove ( queue *q, char *X ); void show (queue *q); void CariMaxPriority(queue *q, int *index);
Fungsi Initialize void initialize ( queue *q ) { q -> jumlah = 0; // jumlah=0, queue dalam kondisi kosong q -> depan = 0; q -> belakang = 0; }
Fungsi Insert void insert ( queue *q,char X, int Y ) { if ( q -> jumlah == maxsize ) printf("\nERROR: queue sudah penuh"); else { // copy X ke array queue q -> data [ q -> belakang ] = X; // copy Y ke array queue q -> priority [ q -> belakang ] = Y; q -> belakang = ( q -> belakang + 1 ); ++ ( q ->jumlah ); }
Fungsi Remove void remove ( queue *q, char *X ) { if ( q -> jumlah = = 0 ) printf(“\nERROR: queue sudah kosong\”); else { *X = q -> data [ q -> depan ]; q -> depan = ( q -> depan + 1 ); -- ( q -> jumlah ); }
Fungsi Is_Empty int Is_Empty ( queue *q ) { if ( q -> jumlah == 0 ) // jumlah = 0 queue kosong return(1); else return(0); }
Fungsi Is_Full int penuh ( queue *q ) { if ( q -> jumlah == maxsize ) // jumlah = maxsize queue penuh return(1); else return(0); }
Fungsi Show void show (queue *q) { printf("\nISI QUEUE :\n"); for(int i=q->depan; i<q->belakang; i++) printf("%c\t%i\n", q->data[i], q->priority[i]); printf("\n"); }
Fungsi CariMaxPriority void CariMaxPriority(queue *q, int *index) { int i, ind; ind=q->depan; for (i=q->depan; i<q->belakang; i++) if(q->priority[ind]<q->priority[i+1]) ind=i+1; } *index=ind;
Fungsi Main void main() { queue *my_queue, q; char item, *x; x = &item; initialize(my_queue); insert(my_queue, 'A', 1); insert(my_queue, 'R', 18); insert (my_queue, 'I', 9); insert(my_queue, 'F', 6); show(my_queue); remove(my_queue, x); remove(my_queue, x); remove (my_queue, x); remove(my_queue, x); }