ANTRIAN
(QUEUE) PADA C++
Kaidah utama dalam konsep queue adalah FIFO yang merupakan
singkatan dari First In First Out, artinya adalah data yang pertama kali
dimasukkan atau disimpan, maka data tersebut adalah yang pertama kali akan diakses
atau dikeluarkan. Analoginya sama dengan antrian di sebuah loket pembelian
tiket kereta, orang yang datang lebih dahulu, maka akan dilayani terlbih
dahulu, dan akan selesai lebih dulu dari orang-orang yang datang setelahnya.
Gambar di bawah ini mengilustrasikan kerja sebuah queue:
Sebuah queue
di dalam program komputer dideklarasikan sebagai sebuah tipe bentukan baru,
di dalam Bahasa C++, biasa disebut struct. Sebuah struktur data dari
sebuah queue setidaknya harus mengandung dua tiga variabel, yakni
variabel HEAD yang akan
berguna sebagai penanda bagian depan antrian, variabel TAIL yang akan berguna sebagai
penanda bagian belakang antrian dan ARRAY DATA dari yang akan menyimpan
data-data yang dimasukkan ke dalam queue tersebut. Berikut adalah syntax
untuk mendeklarasikan struktur data dari sebuah queue menggunakan
Bahasa C++ :
typedef
struct
{
int data[MAX];
int head;
int tail;
}Queue;
|
Penjelasan :
Bagian
program diatas merupakan pendefinisian struct
bernama queue. Didalam struct tersebut terdapat variabel
data[MAX] sebagai array, variabel
head dan variabel tail. Ketiga variabel tersebut bertipe data integer.
a. Fungsi Create ()
Fungsi Create() berfungsi
untuk mengosongkan queue. Berikut syntax untuk fungsi Create():
void
Create()
{
antrian.head=antrian.tail=-1;
}
|
Penjelasan :
Bagian
program diatas merupakan fungsi Create(), yang berfungsi untuk mengosongkan queue dengan cara meletakan antrian.head
dan antrian.tail di posisi awal yaitu
-1.
b. Fungsi IsEmpty ()
Fungsi
IsEmpty() berfungsi untuk mengecek apakah queue
dalam keadaan kosong atau tidak. Berikut syntax
untuk fungsi IsEmpty() :
int
IsEmpty()
{
if(antrian.tail==-1)
return
1;
else
return
0;
}
|
Penjelasan :
Pada fungsi IsEmpty() terdapat
sebuah logika, yaitu :
1.
Jika antrian.tail berada pada posisi -1, maka
return 1 dijalankan, yang berarti antrian dalam kondisi kosong.
2.
Jika tidak, maka yang akan dijalankan adalah
return 0, yang berarti didalam queue
terdapat data didalamnya.
c. Fungsi IsFull ()
Fungsi
IsFull() berfungsi untuk mengecek apakah queue
dalam keadaan penuh atau tidak. Berikut syntax
untuk fungsi IsFull() :
int
IsFull()
{
if(antrian.tail==MAX-1)
return
1;
else
return
0;
}
|
Penjelasan :
Pada
fungsi IsFull() terdapat sebuah logika yaitu :
1.
Jika antrian.tail berada pada posisi MAX-1,
maka return 1 dijalankan yang berarti antrian dalam kondisi penuh.
2.
Jika tidak maka return 0 yang dijalankan, yang berarti antrian masih
bisa diisi data.
d. Fungsi Enqueue(int data)
Fungsi Enqueue(int
data) berfungsi untuk memasukkan data kedalam queue, berikut syntax untuk
fungsi Enqueue(int data) :
void
Enqueue(int data)
{
if(IsEmpty()==1)
{
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
printf("%d
sudah dimasukan",antrian.data[antrian.tail]);
}
else
if(IsFull()==0)
{
antrian.tail++;
antrian.data[antrian.tail]=data;
printf("%d
sudah dimasukan",antrian.data[antrian.tail]);
}
}
|
Penjelasan :
Pada
fungsi Enqueue(int data), sebelum memasukkan nilai maka dilakukan pengecekkan
terhadap fungsi IsEmpty(int data) dan fungsi IsFull(). Terdapat 2 logika
didalam fungsi Enqueue() yaitu :
1.
Jika fungsi IsEmpty bernilai benar (1) berarti
antrian dalam kondisi kosong, maka antrian.head dan antrian.tail dinaikkan satu
tingkat, berarti posisi head dan tail sekarang berada pada posisi 0, baru
kemudian data disimpan kedalam variabel data. Lalu menampilkan pemberitahuan
bahwa data sudah berhasil disimpan.
2.
Jika fungsi IsFull() bernilai salah (0)
berarti antrian belum penuh, maka
antrian.tail dinaikkan posisinya satu tingkat baru kemudian data yang diterima
dari fungsi main akan disimpan kedalam variabel data. Lalu menampilkan
pemberitahuan bahwa data sudah berhasil disimpan.
e. Fungsi Dequeue()
Fungsi
Dequeue() berfungsi untuk mengeluarkan
data yang paling awal masuk atau yang berada pada posisi head. Berikut syntax untuk fungsi Dequeue :
int
Dequeue()
{
int
i;
int
e = antrian.data[antrian.head];
for(i=antrian.head;
i<=antrian.tail-1;i++)
{
antrian.data[i]=antrian.data[i+1];
}
antrian.tail--;
return
e;
}
|
Penjelasan :
Fungsi Dequeue() berfungsi
untuk mengeluarkan atau menghapus data yang pertama dimasukkan. Variabel i
dideklrarasikan sebagai antrian.head, e dideklarasikan sebagai array
antrian.data[antrian.head];. Maka kemudian perulangan, for(i=antrian.head;
i<=antrian.tail-1;i++). Maksudnya
ketika antrian.head lebih kecil sama dengan antrian.tail-1, maka i++ yang
berarti posisi antrian.head dinaikkan satu tingkat. Kemudian antrian data yang
berada pada head dinaikkan indeks arraynya
satu tingkat. Lalu posisi antrian.tail diturunkan satu tingkat. Kemudian
menjalankan e, yang berarti mengembalikan posisi antrian.head ke indeks nya
semula.
f. Fungsi clear()
Fungsi
clear() berfungsi untuk membersihkan antrian. Syntax nya adalah sebagai berikut :
void
Clear()
{
antrian.head=antrian.tail=-1;
printf("CLEAR");
}
|
Penjelasan :
Fungsi Clear() berfungsi
mengosongkan antrian dengan mengembalikan posisi head dan tailnya keposisi -1,
setelah itu akan muncul “CLEAR” berarti antrian telah dikosongkan.
g. Fungsi Tampil()
Fungsi
Tampil() berfungsi untuk menampilkan isi antrian. Syntax nya adalah sebagai berikut:
void
Tampil()
{
if(IsEmpty()==0)
{
for(int
i=antrian.head;i<=antrian.tail;i++)
{
printf("%d",antrian.data[i]);
}
}else
printf("data kosong!\n");
}
|
Penjelasan :
Sebelum menampilkan isi
antrian fungsi Tampil() akan melakukan pengecekkan ke fungsi IsEmpty().
Dalam fungsi Tampil() terdapat
dua logika yaitu :
1.
Jika fungsi IsEmpty() bernilai salah (0) berarti
antrian berisi data. Baru kemudian perulangan yang berfungsi untuk menampilkan
data dijalankan.
2.
Selain itu, berarti antrian tidak berisi data,
maka akan tampil “data kosong!”.
Berikut ini adalah contoh program (source code) queue :
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include
<windows.h>
#define
MAX 5
using
namespace std;
typedef
struct{
int data[MAX];
int head;
int tail;
}Queue;
Queue antrian;
void
Create(){
antrian.head=antrian.tail=-1;
}
int
IsEmpty(){
if(antrian.tail==-1)
return 1;
else
return 0;
}
int
IsFull(){
if(antrian.tail==MAX-1)
return
1;
else
return
0;
}
void
Enqueue(int data){
if(IsEmpty()==1){
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
printf("%d
sudah dimasukan",antrian.data[antrian.tail]);
}
else
if(IsFull()==0){
antrian.tail++;
antrian.data[antrian.tail]=data;
printf("%d
sudah dimasukan",antrian.data[antrian.tail]);
}
}
int
Dequeue(){
int
i;
int
e = antrian.data[antrian.head];
for(i=antrian.head;
i<=antrian.tail-1;i++){
antrian.data[i]=antrian.data[i+1];
}
antrian.tail--;
return
e;
}
void
Clear(){
antrian.head=antrian.tail=-1;
printf("CLEAR");
}
void
Tampil(){
if(IsEmpty()==0){
for(int
i=antrian.head;i<=antrian.tail;i++){
printf("
%d",antrian.data[i]);
}
}else
printf("data kosong!\n");
}
main(){
int
pil;
int
data;
Create();
do{
system("cls");
cout<<"=============================="<<endl;
cout<<"\t\t\tPROGRAM
QUEUE"<<endl;
cout<<"==============================\n\n"<<endl;
cout<<"1.
ENQUEUE\n "<<endl;
cout<<"2.
DEQUEUE\n "<<endl;
cout<<"3.
TAMPIL\n "<<endl;
cout<<"4.
CLEAR\n "<<endl;
cout<<"5.
EXIT\n "<<endl;
cout<<"
Masukan Pilihan : ";cin>>pil;
switch(pil){
case
1:
cout<<"Masukan
Data : ";cin>>data;
Enqueue(data);
break;
case
2:
Dequeue();
break;
case
3:
Tampil();
break;
case
4:
Clear();
break;
case
5:
cout<<endl<<"\nTHANKS";
break;
}
getch();
}while(pil!=5);
return
0;
}
|
Penjelasan :
Program diatas adalah
contoh program (source code) queue yang menggambarkan proses dalam
input data (Enqueue), ambil data (Dequeue), tampil data dan hapus data(Clear). Dengan jumlah maksimal data yang
diinputkan adalah 5.
Output :
a). Memasukkan data kedalam queue.
b). Menampilkan
data yang ada didalam queue.
c). Menghapus data yang paling
pertama dimasukkan.
d). Menampilkan
data yang ada didalam queue.
e). Menghapus
seluruh data yang ada dalam queue.
f). Keluar
dari program.
Contoh 2
Dibawah
ini adalah contoh program queue dengan 6 menu pilihan, yaitu Enqueue, Dequeue, Tampil, Clear,
Cek Queue dan Exit. Menu Enqueue
berfungsi untuk menambahkan data, Dequeue
untuk menghapus data yang pertama dimasukkan, Clear digunakan untuk mengosongkan queue, Cek Queue
digunakan untuk mengecek kondisi queue apakah
kosong, penuh, atau masih bisa diisi, dan menu exit digunakan untuk keluar dari
program.
Fungsi
yang digunakan dalam program ini sama dengan program diatas hanya saja terdapat
menu tambahan yaitu menu Cek Queue.
Menu Cek Queue menggunakan 3 buah
pemilihan kondisi yaitu :
if
(IsEmpty() == 1)
cout<<"\tQueue masih
kosong";
else
if ((IsEmpty() == 0) && (IsFull() == 0))
cout<<"\tQueue sudah terisi,
tapi belum penuh";
else
cout<<"\tQueue sudah
penuh";
|
1. if
(IsEmpty() == 1)
Program akan melakukan
pengecekkan ke fungsi IsEmpty(), jika bernilai benar (1) berarti antrian masih
kosong, maka akan muncul “Queue Masih Kosong”, namun apabila tidak memenuhi
maka akan lanjut ke pemilihan kondisi kedua.
2. if
((IsEmpty() == 0) && (IsFull() == 0))
program akan melakukan
pengecekkan ke fungsi IsEmpty() dan fungsi IsFull() jika kedua fungsi tersebut
bernilai salah (0) akan muncul “Queue sudah terisi, tapi belum penuh”, yang
berarti queue masih bisa ditambah data.
3. Else
Jika pemilihan kondisi pertama
dan kedua tidak terpenuhi, maka secara otomatis pemilihan kondisi ketiga akan
dijalankan dan akan muncul “Queue sudah penuh”.
Input :
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<windows.h>
#define
MAX 8
using
namespace std;
struct
antrian{
int data[MAX+1];
int atas;
int bawah;
}ue;
void
Create(){
ue.atas=ue.bawah=0;
}
int
IsEmpty()
{
if
((ue.atas> ue.bawah) || (ue.atas == 0) && (ue.bawah ==
0))
{return
1;
cout<<"Queue
Kosong";}
else
return
0;
}
int
IsFull()
{
if(ue.bawah==MAX)
{return
1;
cout
<<"Antrian Penuh";}
else
return
0;
}
void
enqueue(int data)
{
if
((ue.atas == 0) && (ue.bawah == 0))
{
ue.atas
= 1;
ue.bawah
= 1;
}
else
{
ue.bawah
= ue.bawah + 1;
}
ue.data[ue.bawah]
= data;
cout<<"\tData
"<<ue.data[ue.bawah]<<" masuk ke queue";
}
int
Dequeue()
{
int
i;
int
e = ue.data[ue.atas];
for(i=ue.atas;
i<=ue.bawah-1;i++)
{
ue.data[i]=ue.data[i+1];
}
cout<<"Data
Teratas Sudah di Hapus";
ue.bawah--;
return
e;
}
void
Clear()
{
ue.atas=ue.bawah=0;
cout<<"Queue Sudah di
Bersihkan";
}
void
Tampil()
{
if(IsEmpty()==0)
{
for(int i=ue.atas;i<=ue.bawah;i++)
{
cout<<"Antrian
ke-"<<i<<" adalah "<<ue.data[i]<<endl;
}
}
else
printf("data kosong!\n");
}
main()
{
int
pil;
int
data;
Create();
do
{system("cls");
cout<<"=============================="<<endl;
cout<<"\tPROGRAM
QUEUE"<<endl;
cout<<"==============================\n\n"<<endl;
cout<<"1.
ENQUEUE\n "<<endl;
cout<<"2.
DEQUEUE\n "<<endl;
cout<<"3.
TAMPIL\n "<<endl;
cout<<"4.
CLEAR\n "<<endl;
cout<<"5.
CEK QUEUE\n "<<endl;
cout<<"6.
EXIT"<<endl;
cout<<"
Masukan Pilihan : ";cin>>pil;
switch(pil){
case
1:
cout<<"Masukan
Data : ";cin>>data;
enqueue(data);
break;
case
2:
Dequeue();
break;
case
3:
Tampil();
break;
case
4:
Clear();
break;
case
5:
if
(IsEmpty() == 1)
cout<<"\tQueue masih
kosong";
else
if ((IsEmpty() == 0) && (IsFull() == 0))
cout<<"\tQueue sudah terisi,
tapi belum penuh";
else
cout<<"\tQueue sudah
penuh";
break;
case
6 :
cout<<"Tekan Enter Untuk
Keluar ";}
getch();
}while(pil!=6);
return
0;}
|
Output :
a). Melakukan
pengecekkan kodisi queue.
b). Memasukkan data kedalam queue.
c). Melakukan pengecekkan kondisi queue.
d). Menampilkan seluruh data yang ada didalam queue.
e). Menghapus data yang paling pertama dimasukkan.
f). Menampilkan data yang ada didalam queue.
g). Menghapus seluruh data yang ada didalam queue.
h). Menampilkan data yang ada didalam queue.
i). Keluar dari program.
Sumber :
Saputri, S. (2016). Queue. Modul Alpro 2-1, 69-86.
Komentar
Posting Komentar