"First In, First Out"
Mahasiswa mampu:
Data terakhir masuk, keluar pertama.
Data pertama masuk, keluar pertama.
Queue adalah struktur data linear yang bekerja berdasarkan prinsip:
Elemen yang pertama kali masuk akan menjadi yang pertama kali keluar.
"Queue memastikan keadilan (fairness) dalam pemrosesan data."
| Karakteristik | Stack | Queue |
|---|---|---|
| Prinsip | LIFO (Last In First Out) | FIFO (First In First Out) |
| Titik Akses | 1 Ujung (Top) | 2 Ujung (Front & Rear) |
| Analogi | Tumpukan Piring | Antrean Tiket |
Jika data masuk berurutan: A, B, C.
Lalu dilakukan operasi "Keluar" (Dequeue) sebanyak 2 kali.
Data apa yang keluar pertama? Dan data apa yang tersisa di Queue?
Pikirkan sejenak sebelum ke slide berikutnya...
Setiap data baru masuk melalui ujung Rear.
Pointer Rear akan bertambah (maju).
Penghapusan data dilakukan pada ujung Front.
Pointer Front akan bertambah (maju).
Front menunjuk ke index elemen pertama.
Rear menunjuk ke index elemen terakhir.
Operasi:
Tentukan isi Queue, posisi Front, dan posisi Rear!
Kita butuh tiga hal utama:
#define MAX 5
int queue[MAX];
int front = -1;
int rear = -1;
Queue dikatakan KOSONG jika:
Atau pada Linear Queue, bisa juga saat front > rear.
// Global
int queue[MAX];
int front = -1, rear = -1;
// Prototipe Fungsi
void enqueue(int data);
void dequeue();
bool isFull();
bool isEmpty();
void display();
rear == MAX - 1, cetak "Overflow"front == -1, set front = 0rear (rear++)queue[rear] = dataAwal: front = -1, rear = -1
1. Enqueue(5)
front = 0, rear = 0
void enqueue(int data) {
if (rear == MAX - 1) {
cout << "Queue Penuh!";
} else {
if (front == -1) front = 0;
rear++;
queue[rear] = data;
}
}
rear == MAX - 1: Mengecek apakah index terakhir sudah tercapai.if (front == -1) front = 0;: Menghidupkan pointer front hanya pada elemen pertama.rear++: Mempersiapkan slot kosong berikutnya.front == -1, cetak "Underflow"queue[front]front (front++)front > rear, set front = rear = -1Queue: [5, 10, 15], front=0, rear=2
1. Dequeue()
front = 1, rear = 2
Data keluar: 5
void dequeue() {
if (front == -1) {
cout << "Queue Kosong!";
} else {
cout << "Keluar: " << queue[front];
front++;
if (front > rear) {
front = rear = -1;
}
}
}
front++: Kita hanya memajukan pointer. Data lama tetap di memori tapi tidak bisa diakses via queue.if (front > rear): Kondisi di mana semua elemen sudah diambil. Kita reset agar index bisa mulai dari 0 lagi nanti.void display() {
if (front == -1) return;
for (int i = front; i <= rear; i++) {
cout << queue[i] << " ";
}
}
Apa yang terjadi jika Rear sudah di akhir array, tapi di depan banyak slot kosong (sudah di-dequeue)?
Rear = 4 (MAX-1) → Program menganggap PENUH!
Padahal index 0-3 kosong melompong.
rear == MAX - 1.Memungkinkan penggunaan kembali slot kosong di depan.
Varian Queue di mana elemen terakhir terhubung kembali ke elemen pertama.
0 → 1 → 2 → 3 → 4 → 0 (Lagi)
Bagaimana cara komputer melakukan ini secara otomatis?
Rumus sakti Circular Queue:
Contoh (MAX = 5):
| Index Sekarang | (Index + 1) % 5 | Index Baru |
|---|---|---|
| 0 | 1 % 5 | 1 |
| 1 | 2 % 5 | 2 |
| 2 | 3 % 5 | 3 |
| 3 | 4 % 5 | 4 |
| 4 | 5 % 5 | 0 |
Queue dikatakan PENUH jika:
Artinya, Rear sudah "mengejar" Front dari belakang.
Queue dikatakan KOSONG jika:
void enqueue(int data) {
if ((rear + 1) % MAX == front) {
cout << "Queue Penuh!";
} else {
if (front == -1) front = 0;
rear = (rear + 1) % MAX; // MANTRA SAKTI
queue[rear] = data;
}
}
(rear + 1) % MAX == front: Cek apakah slot berikutnya adalah Front. Jika iya, berarti sudah melingkar penuh.rear = (rear + 1) % MAX: Menggerakkan rear secara melingkar.void dequeue() {
if (front == -1) {
cout << "Kosong!";
} else {
cout << "Keluar: " << queue[front];
if (front == rear) { // Tinggal 1 data
front = rear = -1;
} else {
front = (front + 1) % MAX; // MAJU MELINGKAR
}
}
}
front == rear: Indikator elemen terakhir dalam queue.front = (front + 1) % MAX: Front juga bergerak melingkar mengikuti Rear.Sederhana, tapi rentan False Overflow.
Sedikit lebih kompleks (modulo), tapi efisien memori.
Circular Queue (MAX = 3):
Di index berapakah angka 4 disimpan?
Langkah demi langkah:
OS menaruh semua dokumen cetak ke dalam Queue. Printer mengambil satu per satu dari Front. Jika koneksi printer putus, antrean tetap tersimpan rapi.
Setiap nasabah yang datang melakukan Enqueue. Setiap CS yang kosong melakukan Dequeue.
Mekanisme "Waiting Room" atau "Matchmaking Queue" memastikan pemain diproses sesuai urutan waktu tunggu.
Breadth-First Search (BFS)
Algoritma ini menggunakan Queue untuk menyimpan daftar node yang harus dikunjungi selanjutnya secara teratur.
Lakukan operasi berikut pada Queue kosong (MAX=5):
Berapakah nilai Front dan Rear sekarang?
enqueue(5);
enqueue(10);
dequeue();
enqueue(15);
display();
Apa output dari display()?
// Ada yang salah di sini:
void enqueue(int data) {
rear++;
queue[rear] = data;
}
Sebutkan 2 masalah pada potongan kode di atas!
Modifikasi kode Queue Anda agar bisa menyimpan Nama Pasien (string) di sebuah Klinik.
Gunakan konsep Circular Queue agar efisien!
Persiapkan diri untuk: Tree & Graph Traversal
Kita akan menggunakan Queue untuk algoritma Breadth-First Search (BFS) dan Level-Order pada Tree.
Jangan lupa kerjakan tugas praktikum di LMS.