Penerapan Queue dalam Sistem Antrian Reservasi Rumah Sakit

1. Pengertian Queue

Salah satu materi yang ada di struktur data yang elemennya dalam bentuk antrian atau bisa disebut dengan Queue. Queue adalah struktur data yang mengakses data secara FIFO (yang awal datang, yang awal diproses) [1]. Seperti pada antrian umumnya, queue di dalam struktur data mempunyai dua sisi diantaranya bagian depan ialah front dan bagian belakan ialah rear. Rear sebagai gerbang awal antrian masuk menuju front lalu melakukan penghapusan object melalui front. Queue ini merupakan salah satu materi struktur data yang sangat penting apalagi  dalam kehidupan sehari hari, tanpa queue pasti akan sangat berantakan. Contoh queue di dalam kehidupan sehari hari ialah : antrian tiket di loket, pendaftaran, dan masih banyak lagi penerapannya.

2. Karakteristik Queue

-       Element antrian yaitu item-item data yang terdapat di dalam antrian [2]

-       Mempunyai dua sisi (front dan rear)

-       Penambahan (enqueue)  item melalui rear

-       Penghapusan (Dequeue) item melalui front

-       Jumlah elemen pada antrian [2]

-       Kondisi antrian

a.     Penuh

Bila elemen di antrian mencapai kapasitas maksimum antrian[2]

b.     Kosong

Bila tidak ada elemen di antrian[2]

3. Kelebihan dan Kekurangan Queue

    Kelebihan :

·       Data pertama yang dimasukkan akan diberikan terlebih dahulu.

·       Banyak data dapat ditangani, cepat serta fleksibel

    Kekurangan :

·       Data yang dimasukkan terakhir kali mungkin tidak dilayani jika waktu layanan habis.

·       Jika memasukkan data baru dalam antrian, data lain harus dihapus

4. Operasi dalam Queue

a.     Create()     : Fungsi untuk membuat dan menginisialisasi antrian dengan membuat Head and Tail = -1

b.    IsEmpty()  : Fungsi ini mengecek apakah antrian sudah penuh, dengan cara mengecek nilai Tail, jika Tail = -1 kosong, kita tidak mencentang Head, karena Head adalah tanda dari kepala antrian (elemen pertama dalam antrian) tidak akan berubah - perubahan, pergerakan dalam antrian terjadi dengan menambahkan elemen Antrian ke belakang menggunakan nilai Tail.

c.     IsFull()      : Fungsi ini memeriksa apakah antrian sudah penuh. Dengan mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah limit elemen array di C), berarti sudah penuh.

d.  Enqueue() : Fungsi ini berfungsi untuk menambahkan elemen ke antrian, elemen yang ditambahkan selalu ditambahkan ke elemen terakhir. Menambahkan elemen selalu memindahkan variabel Tail dengan terlebih dahulu meningkatkan penghitung Tail.

e.   Dequeue() : Fungsi ini digunakan untuk menghapus elemen utama/pertama (kepala) dari antrian Dengan menggerakkan semua elemen antrian ke depan dan mengurangi Tail sebanyak 1. Gunakan loop untuk menyelesaikan gerakan.

f.      Clear()       : Fungsi ini untuk menghapus elemen antrian dengan membuat Tail dan Head = -1. Menghapus elemen antrian tidak benar-benar menghapus larik, itu hanya menetapkan indeks aksesnya ke nilai -1 sehingga elemen antrian tidak lagi dapat dibaca.

g.     Display()   : Fungsi ini menampilkan nilai elemen antrian. Gunakan loop dari awal hingga akhir

5. Representasi Queue

        5.6. Representasi Sekuen

        Representasi queue secara sekuen lebih sulit dibandingkan stack. Untuk array berdimensi satu                QElemen [1:n], memerlukan variable front dan juga rear.

        5.6.1. Representasi Sekuen Linear

        Kondisi Front = rear akan berlaku  jika dan hanya jika tidak terdapat elemen.

        Kondisi awal adalah front = rear = 0.

        Front dan tail selalu bergerak maju/naik sehingga

        1. Bila tail telah mencapai elemen terakhir pada array, antrian akan dianggap penuh walau                     sebenarnya mungkin elemen-elemen awal antrian tersebut telah dihapus (dikosongkan).

        2. Bila front dan tail mencapai nilai yang sama berarti antrian dalam keadaan kosong maka front            dan tail dapat diinisialisasikan kembali ke kondisi semula. Kelemahan Representasi Linear

        Kapasitas penuh yang telah disediakan dapat terpakai seluruhnya yaitu jika telah terjadi                        penghapusan elmen-elemen antrian awal.

        5.6.2. Representasi Melingkar

        Representasi queue lebih efisien dengan menganggap array QElemen [1;n] sebagai circular,                   mendeklarasikan array QElemen sebagai QElemen [0:n-1]. Ketika rear = n-1, elemen akan                   dimasukkan ke QElemen [0] bila lokasi itu telah dikosongkan sebelumnya. Konvensi Front selalu           menunjuk satu posisi setelah elemen pertama di queue sesuai arah jarum jam.

            1. Variable front = rear, jika dan hanya jika queue kosong.

             2. Awalnya front = rear = 1.

       Asumsi circular adalah dengan mengubah algritma AddQ dan DeleteQ. Untuk menambah elemen,        algoritma perlu memindahkan rear satu posisi searah jarum jam, yaitu: if tail = n-1 then tail := 0           else tail := tail * 1

       Efek circular dengan rear := (rear+1) mod n. operator modulo yang menghitung sisa bagi. Mirip           dengan itu, perlu pemindahan front satu posisi searah jarum jam setiap terjadi penghapusan.                    Penghapusan dapat dilakukkan dengan front := (front +1) mod n.

        Algoritma itu dapat dilakukan dengan waktu yang tetap atau 0 (1).

        Front dan Tail Selalu Bergerak Maju/Naik

        a. Untuk penambahan

             Bila tail telah mencapai elemen terakhir dari array, maka akan memakai elemen pertama dari                 array yang telah tidak digunakan (dihapus/dikeluarkan).

        b. Untuk penghapusan

            Bila front telah mencapai elemen terakhir dari array, maka akan menuju ke elemen pertama bila              antrian tersebut masih berisi elemen.

        5.7. Representasi Linked List

        Deklarasi queue menggunakan single linked list sebagai berikut:

           BAHASA PASCAL

         Type

        TData = . . . ;

        TKey = . . . ;

        PNode = ^Node ;

        Node = record

        Key : Tkey ;

        Data : TData ;

        Next : PNode ;

        end ;

        Queue = record

        count : integer ;

        front, {sama dengan first}

        tail : PNode ; {sama dengan last}

        end ;

     Menyimpan count digunakan untuk menyimpan jumlah elemen di queue karena menghitung jumlah elemen di linked list dapat  dengan menelusuri seluruh elemen. Penelusuran ini banyak memakan waktu. Apabila tidak ada keperluan dalam mengetahui jumlah elemen di queue, maka count dapat dihilangkan.

6. Penerapan Queue dalam Antrian Rumah Sakit

        Konsep queue atau bisa disebut sebagai antrian erat hubungannya dengan kehidupan disekitar kita. Salah satu contoh penerapan queue dalam kehidupan sekitar dapat kita lihat pada antrian sebuah rumah sakit. Antrian dapat terjadi karena jumlah pasien melebihi jumlah fasilitas pelayanan yang disediakan sehingga tidak semua pasien dapat di layani secara lansung melainkan pasien akan dilayani satu per satu sesuai dengan urutan kedatangannya.

Berikut penerapan operasi - operasi queue dalam sebuah antrian reservasi rumah sakit :

a.   Enqueue : Operasi enqueue terjadi ketika seorang pasien baru melakukan reservasi online sehingga akan terjadi penambahan jumlah dalam antrian

b.   Dequeue : Operasi dequeue terjadi ketika pasien yang berada pada urutan pertama dalam sebuah antrian sudah dilayani dan meninggalkan rumah sakit

c.   Clear : Operasi clear terjadi ketika petugas yang melayani pasien ingin mengosongkan antrian

d.    IsEmpty : Operasi IsEmpty terjadi ketika petugas yang melayani pasien melihat tidak ada lagi pasien yang perlu dilayani

e.     IsFull : Operasi IsFull terjadi ketika petugas yang melayani pasien melihat bahwa antrian di rumah sakit sudah penuh atau dalam kondisi tidak bisa melayani pasien lebih banyak. 

7. Contoh Program

Berikut merupakan contoh program c mengenai queue atau antrian dalam sebuah rumah sakit.

Source Code

#include <stdio.h>

#include <conio.h>

#include <string.h>

#define MAX 10

int head, tail;

 

struct antrian{

    char pasien[30];

    int dokter;

    char hp[13];

}data[MAX];

void nama_dokter(){//Fungsi untuk menampilkan nama dokter

    printf("\nDaftar Dokter  :\n");

    printf("1.dr.I Putu Eka Utama,Sp.THT-KL\n");

    printf("2.dr.Ni Made Sari Dewi,Sp.M\n");

    printf("3.dr.Ni Nyoman Windi Lestari,Sp.BM\n");

}

void create(){//Fungsi untuk membuat antrian baru yang masih kosong

    head=tail=-1;

}

int isFull(){//Fungsi untuk mengecek apakah antrian sudah penuh

    if(tail==MAX-1) return 1;

    else return 0;

}

int isEmpty(){//Fungsi untuk mengecek apakah antrian kosong

    if(tail==-1) return 1;

    else return 0;

}

void Enqueue(){//Fungsi untuk memasukkan data ke antrian

    if(isFull()) printf("\nAntrian Sudah Penuh!");

    else{

        ++tail;

        nama_dokter();

        printf("\nMasukkan Data Pasien\n");

        printf("\nNama Pasien    : ");

        fflush(stdin);

        fgets(data[tail].pasien,30,stdin);

        printf("Nomor Dokter     : ");

        scanf("%d",&data[tail].dokter);

        if(data[tail].dokter>=1 && data[tail].dokter<=3){

                printf("Nomor HP Pasien : ");

                fflush(stdin);

                fgets(data[tail].hp,13,stdin);

                printf("\nData Pasien Berhasil Dimasukkan!");

        if(head==-1) head=0;

}else{

     printf("\nInputan Salah Mohon Ulangi!");

     --tail;

     getch();

     title();

     Enqueue();

     }

    }

}

void Dequeue(){//Fungsi untuk memaengeluarkan data dari antrian

    if(isEmpty()) printf("\nAntrian Kosong!");

    else{

        int i;

        for(i=head;i<tail;i++){

            strcpy(data[i].pasien,data[i+1].pasien);

            data[i].dokter=data[i+1].dokter;

            strcpy(data[i].hp,data[i+1].hp);

        }

        tail--;

 

    if(tail==-1) head==-1;

    printf("\nAntrian Berhasil Dikeularkan!");

  }

}

void clear(){//Fungsi untuk mengosongkan antrian

    if(isEmpty()) printf("\nAntrian Kosong!");

    else{

        head=tail=-1;

        printf("\nAntrian Berhasil Dikosongkan!");

    }

}

void display(){//Fungsi untuk menampilkan antrian

    int i;

    if(isEmpty()) printf("\nAntrian Kosong!");

    else{

        for(i=head;i<=tail;i++){

            printf("\n\nData Pasien %d :",i+1);

            printf("\nNama Pasien            : %s",data[i].pasien);

            printf("Nama Dokter  : ");

            if(data[i].dokter==1){

                printf("dr.I Putu Eka Utama,Sp.THT-KL");

            }else if(data[i].dokter==2){

                printf("dr.Ni Made Sari Dewi,Sp.M");

            }else if(data[i].dokter==3){

                printf("dr.Ni Nyoman Windi Lestari,Sp.BM");

            }

            printf("\nNomor HP Pasien : %s",data[i].hp);

        }

    }

}

void title(){ //Fungsi untuk membuat judul program

    system ("cls");

    printf("--------------------------------------------------\n");

    printf("\nProgram Reservasi Dokter Rumah Sakit Kasih Ibu\n");

    printf("\n--------------------------------------------------\n");

}

int main(){

    create();

    int pil;

    do{

        title ();

        printf("\nMenu :\n");

        printf("\n1.Masukkan Data Pasien");

        printf("\n2.Keluarkan Dari Antrian");

        printf("\n3.Kosongkan Antrian");

        printf("\n4.Tampilkan Antrian");

        printf("\n5.Keluar\n");

        printf("\nMasukkan Pilihan : ");

        scanf("%d",&pil);

        switch(pil){

        case 1:

            title();

            Enqueue();

            getch();

            break;

        case 2:

            title();

            Dequeue();

            getch();

            break;

        case 3:

            title();

            clear();

            getch();

            break;

        case 4:

            title();

            display();

            getch();

            break;

        }

        }while(pil!=5);

        printf("\nTekan Tombol Sembarang Untuk Keluar"); getch ();

        return 0;

}

8. Penjelasan Program

  • Pada program reservasi dokter ini terdapat fungsi Enqueue untuk memasukkan nama pasien, nomor dokter, dan nomor handphone pasien ke dalam antrian, dalam fungsi Enqueue dipanggil fungsi nama_dokter untuk menampilkan daftar dokter. Pada fungsi ini nama pasien dan nomor handphone pasien disimpan dalam bentuk string dan nomor dokter disimpan dalam bentuk int. Bila user salah memasukkan nomor dokter, maka program akan memberitahu user dan akan kembali memanggil fungsi Enqueue. Setelah berhasil mengisi data, program akan mengeprint data pasien berhasil dimasukkan!
  • Fungsi Dequeue berguna untuk menghapus antrian urutan pertama dengan cara data antrian kedua mengganti data antrian pertama dan begitu seterusnya hingga data antrian terakhir mengganti data antrian yang di depannya. Setelah itu program akan mengeprint antrian berhasil dikeluarkan. Namun, bila antrian memang kosong, program akan mengeprint antrian kosong! Yang mana akan diprint bila ketika memanggil fungsi isEmpty nilai returnya adalah 1
  • Fungsi clear berguna untuk mengosongkan antrian caranya adalah dengan cara membuat head dan tail bernilai -1 dan setelah itu program akan mengeprint antrian berhasil dikosongkan! Sama seperti fungsi Dequeue bila bila antrian memang kosong, program akan mengeprint antrian kosong!
  • Fungsi display sendiri berguna untuk menampilkan seluruh antrian, di mana menggunakan perulangan for yang akan berjalan hingga nilai i sama dengan nilai tail. Dalam perulangan nama pasien dan nomor handphone langsung diprint sedangkan untuk nama dokternya akan diprint sesuai nilai dari nomor dokternya.

9. Hasil Running

a. Saat memasukkan data dengan benar


b. Saat salah memasukkan data


c. Saat menampilkan seluruh data


d. Saat berhasil mengeluarkan antrian pertama


e. Saat berhasil mengosongkan antrian


f. Saat keluar dari program


g. Saat antrian sudah penuh


h. Saat antrian kosong





Kelompok 1
Kelas D

Anggota Kelompok :
Luh Gede Tresna Dewi                                            2008561004
Ni Putu Vina Amandari                                           2008561049
Gede Krisna Surya Artajaya                                    2008561074
I Ketut Teguh Wibawa Lessmana Putra                  2008561084
Marcellino Rivaldo Pelaupessy                               2008561104

DAFTAR PUSTAKA

[1]

R. Selamet, "IMPLEMENTASI STRUKTUR DATA LIST, QUEUE DAN STACK DALAM JAVA," Media Informatika, vol. 15, p. 22, 2016.

[2]

N. ADLAIMI, "STRUKTUR DATA MAJEMUK (QUEUE)," Fakultas Komputer, p. 3.


Komentar