Pertemuan 06
Universitas Pertahanan RI
Setelah pertemuan ini, mahasiswa mampu:
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.
Elemen masuk dari REAR, keluar dari FRONT
| 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 |
ADT Queue mendefinisikan operasi yang dapat dilakukan tanpa menentukan bagaimana diimplementasikan.
| 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 |
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() {}
};
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]
Implementasi sederhana dengan dua variabel penunjuk:
front — indeks elemen terdepanrear — indeks elemen terakhir
void enqueue(const T& item) {
if (isFull()) {
throw overflow_error("Queue penuh!");
}
rearIndex++;
data[rearIndex] = item;
count++;
}
Kompleksitas: O(1)
T dequeue() {
if (isEmpty()) {
throw underflow_error("Queue kosong!");
}
T item = data[frontIndex];
frontIndex++;
count--;
return item;
}
Kompleksitas: O(1)
False Overflow: Ruang di awal array tidak terpakai meski masih ada slot kosong!
Array capacity = 5
Setelah 3x dequeue:
Tidak bisa enqueue meski ada 3 slot kosong!
Geser semua elemen ke depan
O(n) setiap shift!
Wrap-around indeks
O(1) selalu ✓
Circular Queue — Array di mana indeks "melingkar" kembali ke awal ketika mencapai akhir.
nextRear = (rear + 1) % capacity
nextFront = (front + 1) % capacity
Operator modulo (%) memastikan indeks "wrap-around"
void enqueue(const T& item) {
if (isFull()) {
throw overflow_error("Queue penuh!");
}
rearIndex = (rearIndex + 1) % capacity; // Circular!
data[rearIndex] = item;
count++;
}
Kompleksitas: O(1)
T dequeue() {
if (isEmpty()) {
throw underflow_error("Queue kosong!");
}
T item = data[frontIndex];
frontIndex = (frontIndex + 1) % capacity; // Circular!
count--;
return item;
}
Kompleksitas: O(1)
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
Masalah: Tanpa count, kondisi kosong vs penuh ambigu!
Dengan count:
isEmpty(): count == 0isFull(): count == capacityQueue dengan linked list menggunakan pointer front dan rear. Enqueue di rear, dequeue di front.
template <typename T>
struct Node {
T data;
Node* next;
Node(const T& value) : data(value), next(nullptr) {}
};
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)
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;
}
Harus traverse sampai akhir
O(n)
Akses langsung ke tail
O(1) ✓
| 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 |
Deque (dibaca "deck") — struktur data yang memungkinkan insert dan delete dari kedua ujung.
| Operasi | Deskripsi |
|---|---|
insertFront(item) |
Sisipkan di depan |
insertRear(item) |
Sisipkan di belakang |
deleteFront() |
Hapus dari depan |
deleteRear() |
Hapus dari belakang |
Semua operasi: O(1)
| 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
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
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)
C++ menyediakan std::queue dan std::deque
#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
#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
| 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) |
| 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 |
Silakan bertanya atau diskusi
Referensi: Cormen Ch.10.1 | Weiss Ch.3.7 | Hubbard Ch.6
Struktur Data dan Algoritma
Pertemuan 06: Queue
© 2026 - CC BY 4.0