📋 Queue

Struktur Data dan Algoritma

Pertemuan 06

Universitas Pertahanan RI

🎯 Tujuan Pembelajaran

Setelah pertemuan ini, mahasiswa mampu:

  1. Menjelaskan konsep FIFO dan ADT Queue
  2. Mengimplementasikan queue dengan array linear
  3. Mengimplementasikan circular queue
  4. Mengimplementasikan queue dengan linked list
  5. Memahami Deque (double-ended queue)

📋 Agenda

  1. Konsep Dasar Queue (FIFO)
  2. ADT Queue
  3. Implementasi dengan Array Linear
  4. Circular Queue
  5. Queue dengan Linked List
  6. Deque (Double-Ended Queue)
  7. Aplikasi Queue

📖 1. Konsep Dasar Queue

Queue adalah struktur data linear yang mengikuti prinsip FIFO (First In First Out), di mana elemen yang pertama masuk akan pertama keluar.

Berbeda dengan Stack (LIFO), Queue menyerupai antrian di kehidupan nyata.

🔄 Prinsip FIFO

🖼️
Ilustrasi Konsep FIFO pada Queue
images/p06-01-konsep-fifo-queue.png

Elemen masuk dari REAR, keluar dari FRONT

📌 Visualisasi Queue

← Keluar
A
B
C
D
Masuk →
↑ FRONT ↑ REAR

🌍 Analogi Kehidupan Nyata

Analogi Penjelasan
🏦 Antrian bank Datang pertama, dilayani pertama
🚗 Gerbang tol Tiba lebih dulu, lewat lebih dulu
🖨️ Print queue Kirim duluan, cetak duluan
⌨️ Buffer keyboard Ketik duluan, proses duluan

🎖️ Konteks Pertahanan

  • Antrian pesan militer — Menjaga urutan kronologis informasi
  • Task scheduling radar — Pemrosesan sinyal berurutan
  • Buffer surveillance — Data video/audio disimpan sementara sebelum diproses

📝 Karakteristik Queue

  1. Dua ujung berbeda: FRONT (keluar) dan REAR (masuk)
  2. Operasi terbatas: Insert di rear, delete di front
  3. Akses terbatas: Tidak bisa akses elemen tengah langsung
  4. Urutan terjaga: Sesuai waktu kedatangan

📖 2. ADT Queue

ADT Queue mendefinisikan operasi yang dapat dilakukan tanpa menentukan bagaimana diimplementasikan.

⚙️ Operasi Dasar Queue

Operasi Deskripsi Return
enqueue(item) Tambah item ke rear void
dequeue() Hapus & kembalikan dari front item
front() Lihat front tanpa hapus item
isEmpty() Cek apakah kosong bool
isFull() Cek apakah penuh bool

💻 Interface Queue C++


template <typename T>
class QueueADT {
public:
    virtual void enqueue(const T& item) = 0;
    virtual T dequeue() = 0;
    virtual T front() const = 0;
    virtual bool isEmpty() const = 0;
    virtual bool isFull() const = 0;
    virtual int size() const = 0;
    virtual ~QueueADT() {}
};
                    

🧠 Quiz: Trace Operasi Queue

Apa hasil dari operasi berikut?


enqueue(10), enqueue(20), enqueue(30), 
dequeue(), front(), enqueue(40), size()
                        

Jawaban:

dequeue() → 10, front() → 20, size() → 3

Queue akhir: [20, 30, 40]

📖 3. Queue dengan Array Linear

Implementasi sederhana dengan dua variabel penunjuk:

  • front — indeks elemen terdepan
  • rear — indeks elemen terakhir

📊 Visualisasi Array Linear

🖼️
Queue dengan Array Linear
images/p06-02-queue-array-linear.png

💻 Implementasi Enqueue


void enqueue(const T& item) {
    if (isFull()) {
        throw overflow_error("Queue penuh!");
    }
    rearIndex++;
    data[rearIndex] = item;
    count++;
}
                    

Kompleksitas: O(1)

💻 Implementasi Dequeue


T dequeue() {
    if (isEmpty()) {
        throw underflow_error("Queue kosong!");
    }
    T item = data[frontIndex];
    frontIndex++;
    count--;
    return item;
}
                    

Kompleksitas: O(1)

⚠️ Masalah: False Overflow

False Overflow: Ruang di awal array tidak terpakai meski masih ada slot kosong!

⚠️
Ilustrasi False Overflow
images/p06-03-false-overflow-problem.png

📊 Contoh False Overflow

Array capacity = 5

Setelah 3x dequeue:

D
E

Tidak bisa enqueue meski ada 3 slot kosong!

🔧 Solusi False Overflow

Opsi 1: Shift

Geser semua elemen ke depan

O(n) setiap shift!

Opsi 2: Circular

Wrap-around indeks

O(1) selalu ✓

📖 4. Circular Queue

Circular Queue — Array di mana indeks "melingkar" kembali ke awal ketika mencapai akhir.

🔄 Konsep Circular Queue

🔄
Circular Queue sebagai Array Melingkar
images/p06-04-circular-queue-concept.png

📐 Formula Circular Queue

nextRear = (rear + 1) % capacity

nextFront = (front + 1) % capacity

Operator modulo (%) memastikan indeks "wrap-around"

💻 Enqueue Circular


void enqueue(const T& item) {
    if (isFull()) {
        throw overflow_error("Queue penuh!");
    }
    rearIndex = (rearIndex + 1) % capacity; // Circular!
    data[rearIndex] = item;
    count++;
}
                    

Kompleksitas: O(1)

💻 Dequeue Circular


T dequeue() {
    if (isEmpty()) {
        throw underflow_error("Queue kosong!");
    }
    T item = data[frontIndex];
    frontIndex = (frontIndex + 1) % capacity; // Circular!
    count--;
    return item;
}
                    

Kompleksitas: O(1)

📊 Visualisasi Wrap-Around

🔄
Operasi Wrap-Around pada Circular Queue
images/p06-05-circular-queue-operations.png

🧠 Quiz: Circular Queue Trace

Capacity = 5, operasi:


enqueue(A), enqueue(B), enqueue(C), 
dequeue(), dequeue(), enqueue(D), 
enqueue(E), enqueue(F)
                        

Di mana posisi F?

Jawaban: F di indeks 0 (wrap-around!)

rear melingkar dari indeks 4 ke indeks 0

❓ Mengapa Perlu Variabel Count?

Masalah: Tanpa count, kondisi kosong vs penuh ambigu!

Dengan count:

  • isEmpty(): count == 0
  • isFull(): count == capacity

📖 5. Queue dengan Linked List

Queue dengan linked list menggunakan pointer front dan rear. Enqueue di rear, dequeue di front.

📊 Visualisasi Linked Queue

🔗
Queue dengan Singly Linked List
images/p06-06-queue-linked-list.png

🏗️ Struktur Node


template <typename T>
struct Node {
    T data;
    Node* next;
    
    Node(const T& value) : data(value), next(nullptr) {}
};
                    

💻 Enqueue (Linked List)


void enqueue(const T& item) {
    Node* newNode = new Node(item);
    
    if (isEmpty()) {
        frontPtr = newNode;
        rearPtr = newNode;
    } else {
        rearPtr->next = newNode;
        rearPtr = newNode;
    }
    count++;
}
                    

Kompleksitas: O(1)

💻 Dequeue (Linked List)


T dequeue() {
    if (isEmpty()) {
        throw underflow_error("Queue kosong!");
    }
    Node* temp = frontPtr;
    T item = temp->data;
    frontPtr = frontPtr->next;
    if (frontPtr == nullptr) {
        rearPtr = nullptr;  // Queue jadi kosong
    }
    delete temp;
    count--;
    return item;
}
                    

❓ Mengapa Perlu Pointer Rear?

Tanpa rear

Harus traverse sampai akhir

O(n)

Dengan rear

Akses langsung ke tail

O(1) ✓

📊 Perbandingan Implementasi

Aspek Array Linked List
Enqueue O(1) O(1)
Dequeue O(1) O(1)
Memory Fixed size Dinamis
Overhead Tidak ada Pointer per node
Cache Baik Buruk

📖 6. Deque (Double-Ended Queue)

Deque (dibaca "deck") — struktur data yang memungkinkan insert dan delete dari kedua ujung.

🔄 Visualisasi Deque

↔️
Operasi Deque di Kedua Ujung
images/p06-07-deque-concept.png

⚙️ Operasi Deque

Operasi Deskripsi
insertFront(item) Sisipkan di depan
insertRear(item) Sisipkan di belakang
deleteFront() Hapus dari depan
deleteRear() Hapus dari belakang

Semua operasi: O(1)

🔀 Variasi Deque

Jenis Insert Delete
Input-Restricted Satu ujung Kedua ujung
Output-Restricted Kedua ujung Satu ujung

Stack = Deque dengan operasi hanya di satu ujung

Queue = Deque dengan insert di rear, delete di front

💻 insertFront (Circular)


void insertFront(const T& item) {
    if (isFull()) {
        throw overflow_error("Deque penuh!");
    }
    // Geser front ke belakang (circular)
    frontIndex = (frontIndex - 1 + capacity) % capacity;
    data[frontIndex] = item;
    count++;
}
                    

Note: + capacity untuk menghindari indeks negatif

📖 7. Aplikasi Queue

  • 🖨️ Print Spooler — Antrian dokumen cetak
  • 🌐 BFS Traversal — Pencarian level-by-level
  • Task Scheduling — Round-robin CPU scheduling
  • 📡 Buffering — I/O buffer, network packet
  • 🎮 Simulasi — Simulasi antrian sistem

🎖️ Aplikasi Pertahanan

  • Message Queue — Antrian pesan komunikasi militer
  • Radar Processing — Buffer sinyal radar
  • Command Queue — Antrian perintah C4ISR
  • Event Logging — Log kejadian kronologis

🔧 Queue dengan Dua Stack


template <typename T>
class QueueUsingTwoStacks {
    stack<T> stackIn;   // Untuk enqueue
    stack<T> stackOut;  // Untuk dequeue
    
public:
    void enqueue(const T& item) {
        stackIn.push(item);  // O(1)
    }
    
    T dequeue() {
        if (stackOut.empty()) {
            // Transfer dari stackIn ke stackOut
            while (!stackIn.empty()) {
                stackOut.push(stackIn.top());
                stackIn.pop();
            }
        }
        T item = stackOut.top();
        stackOut.pop();
        return item;
    }
};
                    

Amortized: O(1)

📖 8. STL Queue & Deque

C++ menyediakan std::queue dan std::deque

💻 std::queue


#include <queue>
using namespace std;

queue<int> q;

q.push(10);        // Enqueue
q.push(20);
q.push(30);

cout << q.front(); // 10
cout << q.back();  // 30

q.pop();           // Dequeue (hapus 10)
cout << q.size();  // 2
                    

💻 std::deque


#include <deque>
using namespace std;

deque<int> dq;

dq.push_back(10);   // Insert rear
dq.push_front(5);   // Insert front
dq.push_back(15);

// Deque: [5, 10, 15]

cout << dq[1];      // 10 (random access!)

dq.pop_front();     // Hapus 5
dq.pop_back();      // Hapus 15
                    

📝 Ringkasan

Konsep Penjelasan
FIFO First In First Out
Array Linear Masalah false overflow
Circular Queue Solusi dengan wrap-around
Linked Queue Dinamis, overhead pointer
Deque Insert/delete kedua ujung
Kompleksitas Semua operasi O(1)

📊 Perbandingan Implementasi

Implementasi Enqueue Dequeue Space Note
Array Linear O(1) O(1) O(n) False overflow
Circular Array O(1) O(1) O(n) Optimal fixed
Linked List O(1) O(1) O(n) Dinamis
Two Stacks O(1) Amort O(1) O(n) Special case

❓ Pertanyaan?

Silakan bertanya atau diskusi

Referensi: Cormen Ch.10.1 | Weiss Ch.3.7 | Hubbard Ch.6

Terima Kasih! 🙏

Struktur Data dan Algoritma

Pertemuan 06: Queue

© 2026 - CC BY 4.0