🧬Praktikum 1

Pengantar

Pada percobaan ini, kita akan mengimplementasikan struktur data Queue secara sederhana dengan menggunakan class Queue. Perhatikan class diagram Queue berikut,

Langkah Percobaan

  • Buatlah proyek dengan nama "Praktikum1" dan buat class dengan "Queue".

  • Tambahkan atribut-atribut Queue sesuai diagram class, kemudian tambahkan pula

    konstruktornya seperti potongan kode berikut ini.

int[] data;
int front;
int rear;
int size;
int max;

public Queue(int n) {
    max = n;
    data = new int[max];
    size = 0;
    front = rear = -1;
}
  • Buat method isEmpty bertipe boolean yang digunakan untuk mengecek apakah queue kosong.

public boolean isEmpty() {
    if (size == 0) {
        return true;
    } else {
        return false;
    }
}
  • Buat method isFull bertipe boolean yang digunakan untuk mengecek apakah queue sudah penuh.

public boolean isFull() {
    if (size == max) {
        return true;
    } else {
        return false;
    }
}
  • Buat method peek bertipe void untuk menampilkan elemen queue pada posisi paling depan.

public void peek() {
    if (!isEmpty()) {
        System.out.println("Elemen terdepan: " + data[front]);
    } else {
        System.out.println("Queue masih kosong");
    }
}
  • Buat method print bertipe void untuk menampilkan seluruh elemen pada queue mulai dari posisi front sampai dengan posisi rear.

public void print() {
    if (isEmpty()) {
        System.out.println("Queue masih kosong");
    } else {
        int i = front;            
        while (i != rear) {
            System.out.print(data[i] + " ");
            i = (i + 1) % max;
        }
        System.out.println(data[i] + " ");
        System.out.println("Jumlah elemen = " + size);
    }
}
  • Buat method clear bertipe void untuk menghapus semua elemen pada queue.

public void clear() {
    if (!isEmpty()) {
        front = rear = -1;
        size = 0;
        System.out.println("Queue behasil dikosongkan");
    } else {
        System.out.println("Queue masih kosong");
    }
}
  • Buat method enqueue bertipe void untuk menambahkan isi queue dengan parameter dt yang bertipe integer.

public void enqueue(int dt) {
    if (isFull()) {
        System.out.println("Queue sudah penuh");
        //System.exit(-1);
    } else {
        if (isEmpty()) {
            front = rear = 0;
        } else {
            if (rear == max - 1) {
                rear = 0;
            } else {
                rear++;
            }
        }
        data[rear] = dt;
        size++;
    }
}
  • Buat method dequeue bertipe int untuk mengeluarkan data pada queue di posisi belakang.

public int Dequeue() {
    int dt = 0;
    if (IsEmpty()) {
        System.out.println("Queue masih kosong");
        //System.exit(-1);
    } else {
        dt = data[front];
        size--;
        if (IsEmpty()) {
            front = rear = -1;
        } else {
            if (front == max - 1) {
                front = 0;
            } else {
                front++;
            }
        }
    }
    return dt;
}
  • Selanjutnya, buat class baru dengan nama QueueMain tetap pada proyek Praktikum1. Buat method menu bertipe void untuk memilih menu program pada saat dijalankan.

public static void menu() {
    System.out.println("Masukkan operasi yang diinginkan:");
    System.out.println("1. Enqueue");
    System.out.println("2. Dequeue");
    System.out.println("3. Print");
    System.out.println("4. Peek");
    System.out.println("5. Clear");
    System.out.println("-----------------");
}
  • Buat fungsi main, kemudian deklarasikan Scanner dengan nama sc.

  • Buat variabel n untuk menampung masukan berupa jumlah maksimal elemen yang dapat

    disimpan pada queue.

System.out.print("Masukkan kapasitas queue: ");
int n = sc.nextInt();
  • Lakukan instansiasi objek Queue dengan nama Q dengan mengirimkan parameter n sebagai kapasitas elemen queue.

Queue Q = new Queue(n);
  • Deklarasikan variabel dengan nama pilih bertipe integer untuk menampung pilih menu dari pengguna.

  • Lakukan perulangan menggunakan do-while untuk menjalankan program secara terus menerus sesuai masukan yang diberikan. Di dalam perulangan tersebut, terdapat pemilihan kondisi menggunakan switch-case untuk menjalankan operasi queue sesuai dengan masukan pengguna.

do {
    menu();
    pilih = sc.nextInt();
    switch (pilih) {
        case 1:
            System.out.print("Masukkan data baru: ");
            int dataMasuk = sc.nextInt();
            Q.Enqueue(dataMasuk);
            break;
        case 2:
            int dataKeluar = Q.Dequeue();
            if (dataKeluar != 0) {
                System.out.println("Data yang dikeluarkan: " + dataKeluar);
                break;
            }
        case 3:
            Q.print();
            break;
        case 4:
            Q.peek();
            break;
        case 5:
            Q.clear();
            break;
    }
} while (pilih == 1 || pilih == 2 || pilih == 3 || pilih == 4 || pilih == 5);
  • Compile dan jalankan class QueueMain, kemudian amati hasilnya.

  • Verifikasi hasil percobaan.

Pertanyaan

  • Pada konstruktor, mengapa nilai awal atribut front dan rear bernilai -1, sementara atribut size bernilai 0?

  • Pada method enqueue, jelaskan maksud dan kegunaan dari potongan kode berikut!

if (rear == max - 1) {
    rear = 0;
}
  • Pada method dequeue, jelaskan maksud dan kegunaan dari potongan kode berikut!

if (front == max - 1) {
    front = 0;
}
  • Pada method print, mengapa pada proses perulangan variabel i tidak dimulai dari 0 (int i=0), melainkan int i=front?

  • Perhatikan kembali method print, jelaskan maksud dari potongan kode berikut!

i = (i + 1) % max;
  • Tunjukkan potongan kode program yang merupakan queue overflow!

  • Pada saat terjadi queue overflow dan queue underflow, program tersebut tetap dapat berjalan dan hanya menampilkan teks informasi. Lakukan modifikasi program sehingga pada saat terjadi queue overflow dan queue underflow, program dihentikan!

Last updated