Cara Membuat Queue di C++

Cara Membuat Queue di C++

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

  1. Enqueue: Menambahkan elemen ke bagian belakang queue.
  2. Dequeue: Menghapus elemen dari bagian depan queue.
  3. Peek/Front: Mengambil elemen di bagian depan queue tanpa menghapusnya.
  4. 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

  1. Array arr[MAX]: Digunakan untuk menyimpan elemen queue.
  2. Variabel front: Menunjukkan indeks elemen depan.
  3. Variabel rear: Menunjukkan indeks elemen terakhir.
  4. Metode enqueue: Menambahkan elemen ke bagian belakang queue. Jika indeks mencapai batas array, menggunakan operasi modulo untuk melingkar (circular queue).
  5. Metode dequeue: Menghapus elemen dari bagian depan queue.
  6. Metode peek: Mengambil elemen terdepan tanpa menghapusnya.
  7. Metode isEmpty: Mengembalikan true 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

Your email address will not be published. Required fields are marked *