PRAKTIKUM 9: Menggunakan struktur data queue
Studi Kasus
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
menghapus angka teratas dari queue, dan fungsi display Queue untuk menampilkan seluruh angka dalam queue.
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.
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;
}
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.
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.
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;
}
Penjelasan Program:
Struktur Queue:
data: Array dua dimensi yang digunakan untuk menyimpan kata-kata.frontdanrear: Indeks untuk menentukan posisi elemen pertama dan terakhir dalam queue.
Fungsi
initializeQueue:- Menginisialisasi queue dengan mengatur
frontke 0 danrearke -1, menandakan bahwa queue kosong.
- Menginisialisasi queue dengan mengatur
Fungsi
enqueue:- Menambahkan kata ke dalam queue pada posisi
reardan menambah nilairearsetelah penambahan.
- Menambahkan kata ke dalam queue pada posisi
Fungsi
dequeue:- Menghapus kata teratas dari queue (posisi
front) dan memindahkan posisifrontke elemen berikutnya.
- Menghapus kata teratas dari queue (posisi
Fungsi
display:- Menampilkan semua kata yang ada dalam queue dari
fronthinggarear.
- Menampilkan semua kata yang ada dalam queue dari
Fungsi
splitSentenceToQueue:- Memecah kalimat yang diberikan menjadi kata-kata dan memasukkan setiap kata ke dalam queue menggunakan
enqueue.
- Memecah kalimat yang diberikan menjadi kata-kata dan memasukkan setiap kata ke dalam queue menggunakan
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
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
Post a Comment