PERTEMUAN 14
Struktur Data dan Algoritma
Queue dan Karakteristiknya
🧍🧍‍♂️🧍‍♀️🧍‍♂️

"First In, First Out"

Panduan Belajar
Cara Menggunakan Materi Ini
📖Baca slide secara berurutan, jangan melompat.
✍️Ikuti setiap langkah tracing visual dengan teliti.
🤔Kerjakan checkpoint sebelum melihat jawaban.
💻Jalankan contoh kode di compiler Anda sendiri.
Target
Learning Outcomes

Mahasiswa mampu:

  • Memahami konsep dasar dan prinsip FIFO pada Queue
  • Membedakan mekanisme kerja Stack vs Queue
  • Melakukan operasi Enqueue dan Dequeue secara manual
  • Memahami dan mengatasi masalah Linear Queue dengan Circular Queue
  • Mengimplementasikan Queue menggunakan array dalam C++
Review & Context
Stack vs Queue

Stack (LIFO)

Data terakhir masuk, keluar pertama.

📚

Queue (FIFO)

Data pertama masuk, keluar pertama.

🧍🧍‍♂️🧍‍♀️
"Bagaimana jika data diproses berdasarkan urutan kedatangan?"
Definisi
Apa Itu Queue?

Queue adalah struktur data linear yang bekerja berdasarkan prinsip:

FIFO

First In First Out

Elemen yang pertama kali masuk akan menjadi yang pertama kali keluar.

FIFO
Konsep FIFO
Urutan Masuk:
A B C
⬇️
Urutan Keluar:
A dulu
Analogi
Analogi Dunia Nyata
🛒Antrean Kasir
🖨️Antrean Printer
🎧Customer Service
📤Upload File Berurutan
Penerapan IT
Queue dalam Sistem Komputer
  • Job Scheduling: OS mengatur antrean proses yang akan dieksekusi CPU.
  • Print Spooling: Dokumen mengantre untuk dicetak printer.
  • Breadth-First Search (BFS): Algoritma pencarian graf/tree.
  • Buffering: Menampung data sementara sebelum diproses (streaming video/audio).

"Queue memastikan keadilan (fairness) dalam pemrosesan data."

Perbandingan
Stack vs Queue
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
Visualisasi
Mengingat Kembali: Stack
C (Top)
B
A
Arah Keluar: ⬆️ (dari atas)
Visualisasi
Visualisasi Baru: Queue
Keluar (Front) ←
A
B
C
← Masuk (Rear)
Checkpoint
Checkpoint #1

Pertanyaan:

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...

Jawaban
Jawaban Checkpoint #1
  1. Masuk A, B, C → Queue: [A, B, C]
  2. Keluar 1 (Dequeue) → A keluar. Queue: [B, C]
  3. Keluar 2 (Dequeue) → B keluar. Queue: [C]
Hasil Akhir: Data yang keluar adalah A lalu B. Yang tersisa adalah C.
Terminologi
Operasi Dasar Queue
Enqueue: Menambah elemen ke belakang (Rear).
Dequeue: Menghapus elemen dari depan (Front).
📍Front: Pointer ke elemen terdepan.
🔚Rear: Pointer ke elemen terakhir.
Operasi
Enqueue: Menambah Data

Setiap data baru masuk melalui ujung Rear.

Lama
➡️
DATA BARU (Rear)

Pointer Rear akan bertambah (maju).

Operasi
Dequeue: Menghapus Data

Penghapusan data dilakukan pada ujung Front.

KELUAR (Front)
➡️
Sisa Antrean

Pointer Front akan bertambah (maju).

Visual
Front dan Rear
A [0]
B [1]
C [2]

Front menunjuk ke index elemen pertama.
Rear menunjuk ke index elemen terakhir.

Simulator
Simulasi Linear Queue
Siap simulasi.
Checkpoint
Checkpoint #2

Operasi:

  1. Enqueue 10
  2. Enqueue 20
  3. Dequeue
  4. Enqueue 30

Tentukan isi Queue, posisi Front, dan posisi Rear!

Jawaban
Jawaban Checkpoint #2
10 [0]
20 [1]
30 [2]
  • Isi Queue: 20, 30
  • Front: 1
  • Rear: 2
Implementasi
Queue dengan Array

Kita butuh tiga hal utama:

  1. Array: Untuk menyimpan data.
  2. Variabel Front: Menyimpan index depan.
  3. Variabel Rear: Menyimpan index belakang.
#define MAX 5
int queue[MAX];
int front = -1;
int rear = -1;
Logika
Fungsi Front & Rear
📍
Front: Berfungsi sebagai jalur keluar.
Hanya berubah saat Dequeue.
🔚
Rear: Berfungsi sebagai jalur masuk.
Hanya berubah saat Enqueue.
Awal
Kondisi Awal Queue

Queue dikatakan KOSONG jika:

front == -1

Atau pada Linear Queue, bisa juga saat front > rear.

Struktur
Struktur Program Queue
// Global
int queue[MAX];
int front = -1, rear = -1;

// Prototipe Fungsi
void enqueue(int data);
void dequeue();
bool isFull();
bool isEmpty();
void display();
Algoritma
Pseudocode Enqueue
  1. Jika rear == MAX - 1, cetak "Overflow"
  2. Jika front == -1, set front = 0
  3. Naikkan rear (rear++)
  4. queue[rear] = data
Tracing
Tracing Enqueue

Awal: front = -1, rear = -1

1. Enqueue(5)

5 [0]
? [1]

front = 0, rear = 0

Kode
Fungsi Enqueue
void enqueue(int data) {
    if (rear == MAX - 1) {
        cout << "Queue Penuh!";
    } else {
        if (front == -1) front = 0;
        rear++;
        queue[rear] = data;
    }
}
Detail
Penjelasan Enqueue
  • 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.
Algoritma
Pseudocode Dequeue
  1. Jika front == -1, cetak "Underflow"
  2. Ambil data queue[front]
  3. Naikkan front (front++)
  4. Jika front > rear, set front = rear = -1
Tracing
Tracing Dequeue

Queue: [5, 10, 15], front=0, rear=2

1. Dequeue()

5 [0]
10 [1]
15 [2]

front = 1, rear = 2

Data keluar: 5

Kode
Fungsi Dequeue
void dequeue() {
    if (front == -1) {
        cout << "Queue Kosong!";
    } else {
        cout << "Keluar: " << queue[front];
        front++;
        if (front > rear) {
            front = rear = -1;
        }
    }
}
Detail
Penjelasan Dequeue
  • 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.
Kode
Menampilkan Queue
void display() {
    if (front == -1) return;
    for (int i = front; i <= rear; i++) {
        cout << queue[i] << " ";
    }
}
Output
Demo Output
--- Menu Queue ---
1. Enqueue
2. Dequeue
Pilih: 1
Data: 50
Berhasil masuk!
Isi: 50 [F:0, R:0]
Problem
Apakah Linear Queue Efisien?

Masalah: False Overflow

Apa yang terjadi jika Rear sudah di akhir array, tapi di depan banyak slot kosong (sudah di-dequeue)?

Visual
False Overflow
X [0]
X [1]
X [2]
X [3]
99 [4]

Rear = 4 (MAX-1) → Program menganggap PENUH!
Padahal index 0-3 kosong melompong.

Tracing
Simulasi False Overflow
1. Enqueue sampai index 4.
2. Dequeue 3x.
3. Coba Enqueue lagi.
Penyebab
Mengapa Ini Terjadi?
  • Pointer Rear hanya bertambah (maju).
  • Kondisi penuh hanya mengecek rear == MAX - 1.
  • Slot kosong di depan tidak bisa digunakan kembali secara otomatis.
Solusinya? Buat antrean itu Melingkar.
Solusi
Solusi: Circular Queue
🔄

Circular Queue (Antrean Melingkar)

Memungkinkan penggunaan kembali slot kosong di depan.

Definisi
Apa Itu Circular Queue?

Varian Queue di mana elemen terakhir terhubung kembali ke elemen pertama.

0
1
2
3
4
Konsep
Konsep Circular

0 → 1 → 2 → 3 → 4 → 0 (Lagi)

Bagaimana cara komputer melakukan ini secara otomatis?

Operator MODULO (%)

Matematika
Operasi Modulo

Rumus sakti Circular Queue:

index = (index + 1) % MAX

Contoh (MAX = 5):

  • (0 + 1) % 5 = 1
  • (3 + 1) % 5 = 4
  • (4 + 1) % 5 = 0 ← Balik!
Tabel
Contoh Pergerakan Index
Index Sekarang(Index + 1) % 5Index Baru
01 % 51
12 % 52
23 % 53
34 % 54
45 % 50
Logika
Kondisi Queue Penuh

Queue dikatakan PENUH jika:

(rear + 1) % MAX == front

Artinya, Rear sudah "mengejar" Front dari belakang.

Logika
Kondisi Queue Kosong

Queue dikatakan KOSONG jika:

front == -1
Tracing
Simulasi Circular Queue
Masukan data untuk melihat pergerakan melingkar.
Kode
Circular Enqueue
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;
    }
}
Detail
Bedah Kode Circular Enqueue
  • (rear + 1) % MAX == front: Cek apakah slot berikutnya adalah Front. Jika iya, berarti sudah melingkar penuh.
  • rear = (rear + 1) % MAX: Menggerakkan rear secara melingkar.
Kode
Circular Dequeue
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
        }
    }
}
Detail
Bedah Kode Circular Dequeue
  • front == rear: Indikator elemen terakhir dalam queue.
  • front = (front + 1) % MAX: Front juga bergerak melingkar mengikuti Rear.
Review
Linear vs Circular

Linear

Sederhana, tapi rentan False Overflow.

Circular

Sedikit lebih kompleks (modulo), tapi efisien memori.

Checkpoint
Checkpoint #3

Circular Queue (MAX = 3):

  1. Enqueue 1
  2. Enqueue 2
  3. Dequeue (1 keluar)
  4. Enqueue 3
  5. Enqueue 4

Di index berapakah angka 4 disimpan?

Jawaban
Jawaban Checkpoint #3

Langkah demi langkah:

  • Q: [1, 2, _], F:0, R:1
  • Dequeue → Q: [_, 2, _], F:1, R:1
  • Enqueue 3 → Q: [_, 2, 3], F:1, R:2
  • Enqueue 4 → Index = (2+1)%3 = 0
  • Hasil: Q: [4, 2, 3], F:1, R:0
Data 4 masuk ke index 0.
Kasus
Studi Kasus: Printer Spooling
🖨️

OS menaruh semua dokumen cetak ke dalam Queue. Printer mengambil satu per satu dari Front. Jika koneksi printer putus, antrean tetap tersimpan rapi.

Kasus
Sistem Antrean Bank
🏦

Setiap nasabah yang datang melakukan Enqueue. Setiap CS yang kosong melakukan Dequeue.

Simulasi Kasus
Simulasi: Antrean Bank (Circular)
TELLER
--
👩‍💼
NOMOR BERIKUTNYA
B-01
Selamat datang di Bank FIFO. Silakan ambil nomor antrean.
Kasus
Multiplayer Matchmaking
🎮

Mekanisme "Waiting Room" atau "Matchmaking Queue" memastikan pemain diproses sesuai urutan waktu tunggu.

Teori
Queue untuk BFS

Breadth-First Search (BFS)

Algoritma ini menggunakan Queue untuk menyimpan daftar node yang harus dikunjungi selanjutnya secara teratur.

🕸️ → 🧍🧍🧍
Latihan
Latihan 1: Tracing Manual

Lakukan operasi berikut pada Queue kosong (MAX=5):

  1. Enqueue(12), Enqueue(24), Enqueue(36)
  2. Dequeue()
  3. Enqueue(48)
  4. Dequeue()

Berapakah nilai Front dan Rear sekarang?

Latihan
Latihan 2: Output Kode
enqueue(5);
enqueue(10);
dequeue();
enqueue(15);
display();

Apa output dari display()?

Latihan
Latihan 3: Bug Hunting
// Ada yang salah di sini:
void enqueue(int data) {
    rear++;
    queue[rear] = data;
}

Sebutkan 2 masalah pada potongan kode di atas!

Challenge
Mini Challenge

Modifikasi kode Queue Anda agar bisa menyimpan Nama Pasien (string) di sebuah Klinik.

Gunakan konsep Circular Queue agar efisien!

Rangkuman
Ringkasan Konsep
📌FIFO: Elemen pertama masuk adalah yang pertama keluar.
📍Front & Rear: Dua pointer utama navigasi antrean.
🔄Circular Queue: Solusi cerdas mengatasi False Overflow.
Modulo: Kunci pergerakan melingkar pada array.
Warning
Kesalahan Umum
  • Lupa mengecek kondisi Penuh (Overflow) saat Enqueue.
  • Lupa mengecek kondisi Kosong (Underflow) saat Dequeue.
  • Salah rumus Modulo (terbalik atau lupa tanda kurung).
  • Lupa mereset Front dan Rear ke -1 saat data terakhir habis.
Next
Materi Berikutnya

Persiapkan diri untuk: Tree & Graph Traversal

Kita akan menggunakan Queue untuk algoritma Breadth-First Search (BFS) dan Level-Order pada Tree.

🌳 🔜 ⛓️
Tutup
Selamat Belajar!

Queue: Be Fair, Be FIFO!

Jangan lupa kerjakan tugas praktikum di LMS.

🚀