-
Notifications
You must be signed in to change notification settings - Fork 2
Modul 1 [Queue]
-
front
- merupakan node terdepan pada queue. -
rear
- merupakan node terbelakang pada queue. -
FIFO
- first in first out.
Queue adalah struktur data linear yang mengikuti prinsip FIFO. Pada queue, elemen pertama yang dimasukkan adalah elemen pertama yang dapat dikeluarkan. Setiap elemen pada queue selalu ditambahkan dari bagian belakang dan dikeluarkan dari bagian depan. Contoh penerapan dari queue dalam kehidupan sehari-hari adalah proses pengecekan STNK untuk keluar dari gerbang ITS :D.
Queue biasa digunakan pada BFS (Breadth First Search) Graph Traversal
yang nantinya akan dibahas pada modul 4-5 serta penyelesaian problem generate binary number dari 1 hingga n.
Kode Lengkap Dapat Dilihat Disini
Implementasi queue dapat dilakukan dengan menggunakan Singly Linked List dengan menggunakan pointer rear
untuk menunjukkan node paling belakang dan front
untuk menunjukkan node terdepan.
Kompleksitas waktu semua operasi dilakukan secara konstan O(1).
-
Setiap node yang ada pada queue dapat direpresentasikan oleh sebuah struct
QueueNode
yang menyimpan dataint
dan refernsi node selanjutnya menggunakan pointer structQueueNode
ini sendiri.typedef struct queueNode_t { int data; struct queueNode_t *next; } QueueNode;
-
Keseluruhan queue yang ada dikontrol oleh sebuah struct
Queue
yang menyimpan referensi node terdepan dan node terbelekang menggunakan pointer structQueueNode
serta data jumlah node yang ada pada queue menggunakanunsigned
.typedef struct queue_t { QueueNode *_front, *_rear; unsigned _size; } Queue;
-
Fungsi ini diguakan untuk memeriksa apakah queue kosong atau tidak. Prosesnya dilakukan dengan memeriksa apakah pointer
front
ataurear
bernilaiNULL
atau tidak.bool queue_isEmpty(Queue *queue) { return (queue->_front == NULL && queue->_rear == NULL); }
-
Fungsi ini digunakan untuk menambahkan data pada queue. Operasinya dilakukan melalui tahap sebagai berikut:
- Buat node baru dengan struct
QueueNode
. - Jika queue kosong, jadikan node baru ini sebagai
front
danrear
. - Jika queue tidak kosong, maka next dari
rear
adalah node baru, dan jadikan node baru sebagai rear.
void queue_push(Queue *queue, int value) { QueueNode *newNode = (QueueNode*) malloc(sizeof(QueueNode)); if (newNode) { queue->_size++; newNode->data = value; newNode->next = NULL; if (queue_isEmpty(queue)) queue->_front = queue->_rear = newNode; else { queue->_rear->next = newNode; queue->_rear = newNode; } } }
- Buat node baru dengan struct
-
Fungsi ini digunakan untuk menghapus/mengambil
node
terdepan dari queue. Operasinya dilakukan dengan tahap sebagai berikut:- Tampung
front
pada variabel sementaratemp
. - Mengganti
front
dengan referensi next darifront
. - Menghapus variabel sementara sebelumnya.
- Jika
front
kosong, makarear
juga kosong.
void queue_pop(Queue *queue) { if (!queue_isEmpty(queue)) { QueueNode *temp = queue->_front; queue->_front = queue->_front->next; free(temp); if (queue->_front == NULL) queue->_rear = NULL; queue->_size--; } }
- Tampung
-
Fungsi ini digunakan untuk mengambil
data
terdepan dari queue. Operasinya dilakukan dengan tahap sebagai berikut:- Apabila queue tidak kosong, maka return data
front
. - Apabila queue kosong, maka return 0.
int queue_front(Queue *queue) { if (!queue_isEmpty(queue)) { return (queue->_front->data); } return 0; }
- Apabila queue tidak kosong, maka return data
Modul 0
Modul 1
Modul 2
Modul 3
Modul 4
Modul 5
Modul 6