Queue adalah struktur data linear yang menggunakan prinsip FIFO (First In, First Out). Elemen pertama yang dimasukkan ke dalam queue akan menjadi elemen pertama yang keluar. Queue sering digunakan dalam berbagai aplikasi seperti pengelolaan tugas (task scheduling), simulasi antrean, dan lainnya.
Konsep Operasi dalam Queue
- Enqueue: Menambahkan elemen ke bagian belakang queue.
- Dequeue: Menghapus elemen dari bagian depan queue.
- Peek/Front: Mengambil elemen di bagian depan queue tanpa menghapusnya.
- IsEmpty: Memeriksa apakah queue kosong.
Implementasi Queue dengan Array
Berikut adalah contoh implementasi sederhana Queue menggunakan array:
#include <iostream>
#define MAX 100 // Kapasitas maksimum queue
using namespace std;
class Queue {
private:
int arr[MAX]; // Array untuk menyimpan elemen queue
int front; // Menunjuk elemen terdepan
int rear; // Menunjuk elemen terakhir
int size; // Menyimpan jumlah elemen saat ini
public:
Queue() {
front = 0;
rear = -1;
size = 0;
}
// Enqueue: Menambahkan elemen ke queue
void enqueue(int value) {
if (size == MAX) {
cout << "Queue Overflow\n";
return;
}
rear = (rear + 1) % MAX;
arr[rear] = value;
size++;
cout << value << " enqueued to queue\n";
}
// Dequeue: Menghapus elemen dari queue
void dequeue() {
if (size == 0) {
cout << "Queue Underflow\n";
return;
}
cout << arr[front] << " dequeued from queue\n";
front = (front + 1) % MAX;
size--;
}
// Peek/Front: Mengambil elemen di depan
int peek() {
if (size == 0) {
cout << "Queue is empty\n";
return -1;
}
return arr[front];
}
// IsEmpty: Memeriksa apakah queue kosong
bool isEmpty() {
return size == 0;
}
};
int main() {
Queue queue;
queue.enqueue(10);
queue.enqueue(20);
queue.enqueue(30);
cout << "Front element is: " << queue.peek() << endl;
queue.dequeue();
queue.dequeue();
if (queue.isEmpty()) {
cout << "Queue is empty\n";
} else {
cout << "Queue is not empty\n";
}
return 0;
}
Penjelasan Kode
- Array
arr[MAX]
: Digunakan untuk menyimpan elemen queue. - Variabel
front
: Menunjukkan indeks elemen depan. - Variabel
rear
: Menunjukkan indeks elemen terakhir. - Metode
enqueue
: Menambahkan elemen ke bagian belakang queue. Jika indeks mencapai batas array, menggunakan operasi modulo untuk melingkar (circular queue). - Metode
dequeue
: Menghapus elemen dari bagian depan queue. - Metode
peek
: Mengambil elemen terdepan tanpa menghapusnya. - Metode
isEmpty
: Mengembalikantrue
jika queue kosong.
Implementasi Queue dengan Linked List
Queue juga bisa diimplementasikan menggunakan Linked List untuk alokasi memori dinamis:
#include <iostream>
using namespace std;
// Node structure
struct Node {
int data;
Node* next;
};
// Queue class
class Queue {
private:
Node* front; // Menunjuk elemen terdepan
Node* rear; // Menunjuk elemen terakhir
public:
Queue() {
front = nullptr;
rear = nullptr;
}
// Enqueue: Menambahkan elemen ke queue
void enqueue(int value) {
Node* newNode = new Node();
newNode->data = value;
newNode->next = nullptr;
if (rear == nullptr) {
front = rear = newNode;
cout << value << " enqueued to queue\n";
return;
}
rear->next = newNode;
rear = newNode;
cout << value << " enqueued to queue\n";
}
// Dequeue: Menghapus elemen dari queue
void dequeue() {
if (front == nullptr) {
cout << "Queue Underflow\n";
return;
}
Node* temp = front;
cout << front->data << " dequeued from queue\n";
front = front->next;
if (front == nullptr) {
rear = nullptr;
}
delete temp;
}
// Peek/Front: Mengambil elemen di depan
int peek() {
if (front == nullptr) {
cout << "Queue is empty\n";
return -1;
}
return front->data;
}
// IsEmpty: Memeriksa apakah queue kosong
bool isEmpty() {
return front == nullptr;
}
};
int main() {
Queue queue;
queue.enqueue(10);
queue.enqueue(20);
queue.enqueue(30);
cout << "Front element is: " << queue.peek() << endl;
queue.dequeue();
queue.dequeue();
if (queue.isEmpty()) {
cout << "Queue is empty\n";
} else {
cout << "Queue is not empty\n";
}
return 0;
}
Kelebihan dan Kekurangan
Array-Based Queue:
- Kelebihan: Implementasi sederhana.
- Kekurangan: Ukuran tetap (statis), dapat menyebabkan pemborosan memori jika tidak menggunakan circular queue.
Linked List-Based Queue:
- Kelebihan: Ukuran dinamis, tidak ada batasan kapasitas.
- Kekurangan: Membutuhkan memori tambahan untuk pointer.
Jika Anda ingin mengembangkan lebih lanjut, seperti implementasi Priority Queue atau Deque (Double-Ended Queue), beri tahu saya! 😊
Leave a Reply