Modul 1 (Queue) - Algoritma-dan-Pemrograman-ITS/StrukturData GitHub Wiki
- front – merupakan node yang paling depan pada queue.
- rear – merupakan node yang paling belakang pada queue.
Queue merupakan struktur data linear yang menggunakan prinsip First In First Out (FIFO). Dengan prinsip FIFO, elemen pertama yang dimasukkan akan menjadi elemen pertama yang akan dikeluarkan. Setiap elemen pada queue selalu ditambahkan di akhir dan dikeluarkan di depan. Contoh penerapannya adalah barisan orang yang menunggu bus. Orang pertama yang pada antrian menjadi yang pertama yang dapat menaiki bus.
Penerapan queue biasa digunakan dalam BFS(Breadth-First-Search) graph transversal.
- isEmpty – untuk memeriksa apakah queue kosong atau tidak.
- size – untuk mendapatkan data size pada queue.
- push/enqueue – operasi untuk menambahkan data pada antrian dari belakang.
- pop/dequeue – operasi untuk menghapus data terdepan pada antrian.
- front – untuk mendapatkan data terdepan pada antrian.
Kompleksitas waktu semua operasi dilakukan secara konstan O(
Queue biasa digunakan pada BFS (Breafth First Search) graph transersal yang nantinya akan dijelaskan pada modul selanjutnya. Contoh problem lain yang dapat diselesaikan dengan queue adalah melakukan generate binary number dari
Link Implementasi Lengkap Queue
dapat dilihat di sini
Implementasi queue dapat dilakukan dengan menggunakan Singly Linked List dengan menggunakan pointer rear
untuk menunjukkan index paling belakang antrian dan front
untuk menunjukkan index terdepan pada antrian.
-
Queue direpresentasikan oleh node bernama
QueueNode
yang menyimpan dataint
dan referensi untuk node selanjutnya.typedef struct queueNode_t { int data; struct queueNode_t *next; } QueueNode;
-
Queue memiliki dua pointer referensi pada strukturnya yaitu
rear
danfront
.typedef struct queue_t { QueueNode *_front, *_rear; unsigned _size; } Queue;
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; return 0; }
Catatan: STL Queue tidak memiliki iterator
-
Untuk memeriksa apakah queue kosong, cukup dengan memeriksa apakah
front
danrear
queue tersebut bernilaiNULL
atau tidak.bool queue_isEmpty(Queue *queue) { return (queue->_front == NULL && queue->_rear == NULL); }
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; if(q.empty()){ cout << "queue ini kosong" << endl; } return 0; }
-
Untuk melakukan push, langkah-langkahnya adalah sebagai berikut.
-
Buat node baru.
-
Jika queue kosong, jadikan node baru sebagai front dan rear
-
Jika tidak kosong, maka next dari rear adalah node baru, 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; } } }
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; q.push(1); q.push(2); q.push(3); q.push(4); return 0; }
-
-
Untuk melakukan pop, dilakukan langkah langkah berikut.
-
Tampung front pada variabel temp (temporary).
-
Mengganti front dengan referensi next dari front.
-
Menghapus node temp.
-
Jika front kosong, maka rear 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--; } }
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; q.push(1); q.push(2); q.push(3); q.push(4); q.pop(); return 0; }
-
-
int queue_front(Queue *queue) { if (!queue_isEmpty(queue)) { return (queue->_front->data); } return 0; }
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; q.push(1); q.push(2); q.push(3); q.push(4); while(!q.empty()){ cout << q.front() << endl; q.pop(); } return 0; }
Selengkapnya mengenai std::queue
dapat dibaca di sini atau pada dokumentasi bahasa C++ di sini.