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
Anggota Kelompok :
[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
Posting Komentar