PRAKTIKUM 9: Menggunakan struktur data queue

Studi Kasus

1. Implementasikan sebuah program yang menggunakan queue untuk menyimpan angka-angka
bulat. Program tersebut harus memiliki fitur berikut:
Enqueue: Menambahkan angka ke dalam queue.
Dequeue: Menghapus angka teratas dari queue.
Display: Menampilkan seluruh angka dalam queue.

1. Jawaban Soal queue untuk menyimpan angka-angka bulat

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini

#include <stdio.h>

#include <stdlib.h>


#define MAX_SIZE 100


typedef struct {

int data[MAX_SIZE];

int front;

int rear;

 } Queue;


 void initializeQueue(Queue *q) {

 q->front = -1;

 q->rear = -1;

 }


 int isFull(Queue *q) {

 return (q->rear == MAX_SIZE - 1);

 }


 int isEmpty(Queue *q) {

 return (q->front == -1 || q->front > q->rear);

 }


 void enqueue(Queue *q, int item) {

 if (isFull(q)) {

 printf("Queue penuh, tidak bisa menambahkan elemen.\n");

 } else {

 if (q->front == -1) {

 q->front = 0;

 }

 q->rear++;

 q->data[q->rear] = item;

 printf("Angka %d ditambahkan ke dalam queue.\n", item);

 }

 }


 void dequeue(Queue *q) {

 if (isEmpty(q)) {

 printf("Queue kosong, tidak ada elemen yang dihapus.\n");

 } else {

 int item = q->data[q->front];

 q->front++;

 printf("Angka %d dihapus dari queue.\n", item);

 }

 }


 void displayQueue(Queue *q) {

 if (isEmpty(q)) {

 printf("Queue kosong.\n");

 } else {

 printf("Isi Queue: ");

 for (int i = q->front; i <= q->rear; i++) {

 printf("%d ", q->data[i]);

 }

 printf("\n");

 }

 }


 int main() {

 Queue q;

 initializeQueue(&q);


 enqueue(&q, 10);

 enqueue(&q, 20);

 enqueue(&q, 30);

 enqueue(&q, 40);


 displayQueue(&q);


 dequeue(&q);

 dequeue(&q);


 displayQueue(&q);


 return 0;

 }

▪ Klik menu file Save, ketikan nama

▪ Klik Build →Build and Run atau icon

▪ berikut hasilnya

    

Analisi Program

Dalam program diatas, kita menggunakan struktur data queue yang diimplementasikan sebagai array. Fungsi enqueue digunakan untuk menambahkan angka ke dalam queue, fungsi dequeue untuk
menghapus angka teratas dari queue, dan fungsi display Queue untuk menampilkan seluruh angka dalam queue.


2. Buatlah program yang menggunakan queue untuk menerapkan antrian pelanggan di suatu toko.
Program tersebut harus memiliki fitur berikut:
Enqueue: Menambahkan data pelanggan (nama dan nomor antrian) ke dalam queue.
Dequeue: Menghapus data pelanggan teratas dari queue setelah selesai dilayani.
Display: Menampilkan seluruh data pelanggan dalam queue.

2. Jawaban Soal queue untuk menerapkan antrian pelanggan di suatu toko

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini

#include <stdio.h>

#include <stdlib.h>


#define MAX_SIZE 100


typedef struct {

char nama[50];

int nomorAntrian;

} Pelanggan;


 typedef struct {

 Pelanggan data[MAX_SIZE];

 int front;

 int rear;

 } Queue;


 void initializeQueue(Queue *q) {

 q->front = -1;

 q->rear = -1;

 }


 int isFull(Queue *q) {

 return (q->rear == MAX_SIZE - 1);

 }


 int isEmpty(Queue *q) {

 return (q->front == -1 || q->front > q->rear);

 }


 void enqueue(Queue *q, Pelanggan pelanggan) {

 if (isFull(q)) {

 printf("Antrian penuh, tidak bisa menambahkan pelanggan.\n");

 } else {

 if (q->front == -1) {

 q->front = 0;

 }

 q->rear++;

 q->data[q->rear] = pelanggan;

 printf("Pelanggan %s dengan nomor antrian %d ditambahkan ke dalam antrian.\n", pelanggan.nama, pelanggan.nomorAntrian);

 }

 }


 void dequeue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong, tidak ada pelanggan yang dilayani.\n");

 } else {

 Pelanggan pelanggan = q->data[q->front];

 q->front++;

 printf("Pelanggan %s dengan nomor antrian %d telah dilayanidan dikeluarkan dari antrian.\n", pelanggan.nama, pelanggan.nomorAntrian);

 }

 }


 void displayQueue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong.\n");

 } else {

 printf("Data Pelanggan dalam Antrian:\n");

 for (int i = q->front; i <= q->rear; i++) {

 Pelanggan pelanggan = q->data[i];

 printf("Pelanggan %s dengan nomor antrian %d\n", pelanggan.nama, pelanggan.nomorAntrian);

 }

 }

 }


 int main() {

 Queue q;

 initializeQueue(&q);


 Pelanggan pelanggan1 = {"Budi Sudarsono", 1};

 Pelanggan pelanggan2 = {"Egy Maulana", 2};

 Pelanggan pelanggan3 = {"Andika Suroso", 3};


 enqueue(&q, pelanggan1);

 enqueue(&q, pelanggan2);

 enqueue(&q, pelanggan3);


 displayQueue(&q);


 dequeue(&q);

 dequeue(&q);


 displayQueue(&q);


 return 0;

 }

▪ Klik menu file Save, ketikan nama

▪ Klik Build →Build and Run atau icon

▪ berikut hasilnya

    

Analisi Program

Dalam program diatas, kita menggunakan struktur data queue untuk menerapkan antrian pelanggan di toko. Setiap pelanggan memiliki atribut nama dan nomor antrian. Fungsi enqueue digunakan untuk menambahkan data pelanggan ke dalam antrian, fungsi dequeue untuk menghapus pelanggan teratas setelah selesai dilayani, dan fungsi displayQueue untuk menampilkan seluruh data pelanggan dalam antrian.


3. Implementasikan program yang menggunakan queue untuk mensimulasikan proses
penjadwalan CPU. Program tersebut harus memiliki fitur berikut:
Enqueue: Menambahkan proses (dalam bentuk nama atau ID) ke dalam queue.
Dequeue: Menghapus proses teratas dari queue setelah selesai dieksekusi.
Display: Menampilkan seluruh proses dalam queue.

3. Jawaban Soal queue untuk mensimulasikan proses penjadwalan CPU

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini

#include <stdio.h>

#include <stdlib.h>


#define MAX_SIZE 100


typedef struct {

char nama[50];

} Proses;


 typedef struct {

 Proses data[MAX_SIZE];

 int front;

 int rear;

 } Queue;


 void initializeQueue(Queue *q) {

 q->front = -1;

 q->rear = -1;

 }


 int isFull(Queue *q) {

 return (q->rear == MAX_SIZE - 1);

 }


 int isEmpty(Queue *q) {

 return (q->front == -1 || q->front > q->rear);

 }


 void enqueue(Queue *q, Proses proses) {

 if (isFull(q)) {

 printf("Antrian penuh, tidak bisa menambahkan proses.\n");

 } else {

 if (q->front == -1) {

 q->front = 0;

 }

 q->rear++;

 q->data[q->rear] = proses;

 printf("Proses %s ditambahkan ke dalam antrian.\n", proses.nama);

 }

 }


 void dequeue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong, tidak ada proses yang dieksekusi.\n");

 } else {

 Proses proses = q->data[q->front];

 q->front++;

 printf("Proses %s telah dieksekusi dan dikeluarkan dari antrian.\n", proses.nama);

 }

 }


 void displayQueue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong.\n");

 } else {

 printf("Data Proses dalam Antrian:\n");

 for (int i = q->front; i <= q->rear; i++) {

 Proses proses = q->data[i];

 printf("Proses %s\n", proses.nama);

 }

 }

 }


 int main() {

 Queue q;

 initializeQueue(&q);


 Proses proses1 = {"Proses A"};

 Proses proses2 = {"Proses B"};

 Proses proses3 = {"Proses C"};


 enqueue(&q, proses1);

 enqueue(&q, proses2);

 enqueue(&q, proses3);


 displayQueue(&q);


 dequeue(&q);

 dequeue(&q);


 displayQueue(&q);


 return 0;

 }

▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya

Analisi Program

Program di atas, kita menggunakan struktur data queue untuk mensimulasikan proses penjadwalan CPU. Setiap proses memiliki atribut nama. Fungsi enqueue digunakan untuk menambahkan proses ke dalam antrian, fungsi dequeue untuk menghapus proses teratas setelah selesai dieksekusi, dan fungsi display Queue untuk menampilkan seluruh proses dalam antrian.



4. Buatlah program yang menggunakan queue untuk mengimplementasikan algoritma Breadth-
First Search (BFS) pada graf. Program tersebut harus memiliki fitur berikut:
Enqueue: Menambahkan simpul (dalam bentuk nama atau ID) ke dalam queue.
Dequeue: Menghapus simpul teratas dari queue setelah dikunjungi.
Display: Menampilkan seluruh simpul yang ada dalam queue.

4. Jawaban Soal queue mengimplementasikan algoritma BFS pada graf

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini

#include <stdio.h>

#include <stdlib.h>


#define MAX_SIZE 100


typedef struct {

int data;

} Simpul;


 typedef struct {

 Simpul data[MAX_SIZE];

 int front;

 int rear;

 } Queue;


 void initializeQueue(Queue *q) {

 q->front = -1;

 q->rear = -1;

 }


 int isFull(Queue *q) {

 return (q->rear == MAX_SIZE - 1);

 }


 int isEmpty(Queue *q) {

 return (q->front == -1 || q->front > q->rear);

 }


 void enqueue(Queue *q, Simpul simpul) {

 if (isFull(q)) {

 printf("Antrian penuh, tidak bisa menambahkan simpul.\n");

 } else {

 if (q->front == -1) {

 q->front = 0;

 }

 q->rear++;

 q->data[q->rear] = simpul;

 printf("Simpul %d ditambahkan ke dalam antrian.\n", simpul.data);

 }

 }


 void dequeue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong, tidak ada simpul yang dikunjungi.\n");

 } else {

 Simpul simpul = q->data[q->front];

 q->front++;

 printf("Simpul %d telah dikunjungi dan dikeluarkan dari antrian.\n", simpul.data);

 }

 }


 void displayQueue(Queue *q) {

 if (isEmpty(q)) {

 printf("Antrian kosong.\n");

 } else {

 printf("Data Simpul dalam Antrian:\n");

 for (int i = q->front; i <= q->rear; i++) {

 Simpul simpul = q->data[i];

 printf("Simpul %d\n", simpul.data);

 }

 }

 }


 void bfs(int graf[][5], int start, int jumlah_simpul) {

 Queue q;

 initializeQueue(&q);


 int visited[MAX_SIZE] = {0};


 Simpul simpul;

 simpul.data = start;

 enqueue(&q, simpul);

 visited[start] = 1;


 printf("Urutan kunjungan simpul BFS: %d ", start);


 while (!isEmpty(&q)) {

 Simpul current = q.data[q.front];

 dequeue(&q);


 for (int i = 0; i < jumlah_simpul; i++) {

 if (graf[current.data][i] == 1 && visited[i] == 0) {

 Simpul next;

 next.data = i;

 enqueue(&q, next);

 visited[i] = 1;

 printf("%d ", next.data);

 }

 }

 }

 printf("\n");

 }


 int main() {

 int graf[5][5] = {{0, 1, 0, 1, 0},

 {1, 0, 1, 0, 1},

 {0, 1, 0, 1, 0},

 {1, 0, 1, 0, 0},

 {0, 1, 0, 0, 0}};


 int start_simpul = 0;

 int jumlah_simpul = 5;


 bfs(graf, start_simpul, jumlah_simpul);


 return 0;

 }

▪ Klik menu file Save, ketikan nama

▪ Klik Build →Build and Run atau icon

▪ berikut hasilnya

    

Analisis Program

Program di atas, kita menggunakan struktur data queue untuk mengimplementasikan algoritma Breadth-First Search (BFS) pada graf. Graf diwakili oleh matriks kedekatan, di mana nilai 1 menunjukkan adanya sambungan antara dua simpul. Fungsi bfs menerima matriks graf, simpul awal, dan jumlah simpul sebagai argumen. Ini mengimplementasikan algoritma BFS dengan menggunakan queue untuk melacak kunjungan simpul. Setiap simpul dikunjungi, dimasukkan ke dalam antrian menggunakan fungsi enqueue, dan kemudian dikeluarkan menggunakan fungsi dequeue. Selama proses BFS, simpul-simpul yang dikunjungi ditampilkan secara berurutan.



5. Implementasikan sebuah program yang menggunakan queue untuk menyimpan kata-kata
dalam sebuah kalimat. Program tersebut harus memiliki fitur berikut:
Enqueue: Menambahkan kata ke dalam queue.
Dequeue: Menghapus kata teratas dari queue.
Display: Menampilkan seluruh kata dalam queue.

5. Jawaban Soal menggunakan queue untuk menyimpan kata-kata dalam sebuah kalimat.

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini


#include <stdio.h>

#include <stdlib.h>

#include <string.h>


#define MAX_SIZE 100


// Struktur Queue

struct Queue {

    char data[MAX_SIZE][MAX_SIZE]; // Menyimpan kata-kata

    int front;

    int rear;

};


// Fungsi untuk menginisialisasi queue

void initializeQueue(struct Queue *queue) {

    queue->front = 0;

    queue->rear = -1;

}


// Fungsi Enqueue: Menambahkan kata ke dalam queue

void enqueue(struct Queue *queue, char *word) {

    if (queue->rear == MAX_SIZE - 1) {

        printf("Queue overflow, tidak dapat menambahkan kata\n");

    } else {

        queue->rear++;

        strcpy(queue->data[queue->rear], word);

    }

}


// Fungsi Dequeue: Menghapus kata teratas dari queue

void dequeue(struct Queue *queue) {

    if (queue->front > queue->rear) {

        printf("Queue underflow, tidak ada kata yang dapat dihapus\n");

    } else {

        printf("Menghapus kata: %s\n", queue->data[queue->front]);

        queue->front++;

    }

}


// Fungsi Display: Menampilkan seluruh kata dalam queue

void display(struct Queue queue) {

    if (queue.front > queue.rear) {

        printf("Queue kosong\n");

    } else {

        printf("Kata-kata dalam queue: \n");

        for (int i = queue.front; i <= queue.rear; i++) {

            printf("%s ", queue.data[i]);

        }

        printf("\n");

    }

}


// Fungsi untuk memecah kalimat menjadi kata-kata dan memasukkan ke dalam queue

void splitSentenceToQueue(struct Queue *queue, char *sentence) {

    char *word = strtok(sentence, " "); // Memecah kalimat menjadi kata

    while (word != NULL) {

        enqueue(queue, word);

        word = strtok(NULL, " ");

    }

}


int main() {

    struct Queue queue;

    char sentence[MAX_SIZE];


    // Inisialisasi queue

    initializeQueue(&queue);


    // Input kalimat

    printf("Masukkan sebuah kalimat: ");

    fgets(sentence, sizeof(sentence), stdin);


    // Menghapus karakter newline pada akhir kalimat

    if (sentence[strlen(sentence) - 1] == '\n') {

        sentence[strlen(sentence) - 1] = '\0';

    }


    // Memecah kalimat dan memasukkan kata ke dalam queue

    splitSentenceToQueue(&queue, sentence);


    // Menampilkan kata-kata dalam queue

    display(queue);


    // Menghapus kata teratas dari queue

    dequeue(&queue);


    // Menampilkan kata-kata dalam queue setelah dequeue

    display(queue);


    return 0;

}

▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
    


Penjelasan Program:

  1. Struktur Queue:

    • data: Array dua dimensi yang digunakan untuk menyimpan kata-kata.
    • front dan rear: Indeks untuk menentukan posisi elemen pertama dan terakhir dalam queue.
  2. Fungsi initializeQueue:

    • Menginisialisasi queue dengan mengatur front ke 0 dan rear ke -1, menandakan bahwa queue kosong.
  3. Fungsi enqueue:

    • Menambahkan kata ke dalam queue pada posisi rear dan menambah nilai rear setelah penambahan.
  4. Fungsi dequeue:

    • Menghapus kata teratas dari queue (posisi front) dan memindahkan posisi front ke elemen berikutnya.
  5. Fungsi display:

    • Menampilkan semua kata yang ada dalam queue dari front hingga rear.
  6. Fungsi splitSentenceToQueue:

    • Memecah kalimat yang diberikan menjadi kata-kata dan memasukkan setiap kata ke dalam queue menggunakan enqueue.
  7. Main function:

    • Program meminta input kalimat dari pengguna, memecah kalimat menjadi kata-kata, memasukkannya ke dalam queue, menampilkan isi queue, kemudian menghapus kata teratas dan menampilkan queue setelah penghapusan.


Studi Kasus implementasi operasi dasar stack

Buatlah program dalam bahasa C yang menggunakan stack untuk mengubah sebuah string menjadi palindrome. Program harus menerima input string dari pengguna dan menggunakan stack untuk memeriksa apakah string tersebut adalah palindrome atau bukan.

1. Jawaban Soal

▪ Buka Text Editor Code::Blocks,

▪ Pilih menu klik file → New→Empty File

▪ Ketikan koding di bawah ini


#include <stdio.h>

#define SIZE 5


typedef struct {

int data[SIZE];

int front;

int rear;

} Queue;


 void initializeQueue(Queue *q) {

 q->front = -1;

 q->rear = -1;

 }


 int isFull(Queue *q) {

 return (q->rear == SIZE - 1);

 }


 int isEmpty(Queue *q) {

 return (q->front == -1 || q->front > q->rear);

 }


 void enqueue(Queue *q, int item) {

 if (isFull(q)) {

 printf("Queue penuh. Tidak dapat menambahkan item.\n");

 } else {

 if (q->front == -1)

 q->front = 0;

 q->rear++;

 q->data[q->rear] = item;

 printf("Item %d ditambahkan ke dalam queue.\n", item);

 }

 }


 void dequeue(Queue *q) {

 if (isEmpty(q)) {

 printf("Queue kosong. Tidak ada item yang dihapus.\n");

 } else {

 int item = q->data[q->front];

 q->front++;

 printf("Item %d dihapus dari queue.\n", item);

 if (q->front > q->rear)

 initializeQueue(q);

 }

 }


 void displayQueue(Queue *q) {

 if (isEmpty(q)) {

 printf("Queue kosong.\n");

 } else {

 printf("Queue: ");

 for (int i = q->front; i <= q->rear; i++) {

 printf("%d ", q->data[i]);

 }

 printf("\n");

 }

 }


 int main() {

 Queue q;

 initializeQueue(&q);


 enqueue(&q, 10);

 enqueue(&q, 20);

 enqueue(&q, 30);

 displayQueue(&q);


 dequeue(&q);

 displayQueue(&q);


 return 0;

 }


▪ Klik menu file Save, ketikan nama

▪ Klik Build →Build and Run atau icon

▪ berikut hasilnya

    


Analisis Program

Program di atas telah dilengkapi dengan implementasi fungsi enqueue dan dequeue. Fungsi enqueue akan menambahkan item ke dalam queue jika queue belum penuh, sedangkan fungsi dequeue akan menghapus item teratas dari queue jika queue tidak kosong.




































Comments

Popular posts from this blog

PRAKTIKUM 11: Menggunakan struktur data tree dalam pemrograman

PRAKTIKUM 3: Menggunakan fungsi dan prosedur dalam pemrograman

1 .pengantar pemrograman