Langsung ke konten utama

Antrian (Queue) - Algoritma Pemrograman 2

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

Postingan populer dari blog ini

Graf (Graph) dan Pohon (Tree) - Algoritma Pemrograman 2

Graf ( Graph ) dan Pohon (Tree) pada C++ 1). Definisi Graph Graf adalah kumpulan noktah (simpul) di dalam bidang dua dimensi yang dihubungkan dengan sekumpulan garis (sisi). Graph dapat digunakan untuk merepresentasikan objek-objek diskrit dan hubungan antara objek-objek tersebut. Representasi visual dari graph adalah dengan menyatakan objek sebagai noktah, bulatan atau titik ( Vertex ), sedangkan hubungan antara objek dinyatakan dengan garis ( Edge ). G = (V, E) Dimana : G = Graph V = Simpul atau Vertex , atau Node, atau Titik E = Busur atau Edge , atau arc Graf merupakan suatu cabang ilmu yang memiliki banyak terapan. Banyak sekali struktur yang bisa direpresentasikan dengan graf, dan banyak masalah yang bisa diselesaikan dengan bantuan graf. Seringkali graf digunakan untuk merepresentasikan suaru jaringan. Misalkan jaringan jalan raya dimodelkan graf dengan kota sebagai simpul ( vertex/node ) dan jalan yang menghubungkan setiap kotanya sebagai sisi ( edge ) y...

Akses File - Algoritma Pemrograman

AKSES FILE PADA C++ KATA PENGANTAR Puji dan syukur penulis panjatkan kehadirat Allah SWT. Karena dengan Rahmat dan Karunia-Nya, penulis dapat menyelesaikan pembuatan artikel dengan judul Akses File hingga selesai . Dengan diberikannya tugas pembuatan artikel di sebuah blog, mahasiswa diharapkan mampu mempelajari lebih banyak lagi materi mengenai Akses File dan mampu menyelesaikan tugas mata kuliah algoritma pemrograman yang diberikan oleh dosen . Semoga dengan pembuatan artikel ini dapat bermanfaat khususnya bagi penulis selaku mahasiswa dan umumnya bagi kita semua. Selanjutnya penulis, merasa bahwa artikel Akses File ini jauh dari kesempurnaan. Oleh sebab itu, penulis mohon maaf sebesar-besarnya apabila dalam penyusunan artikel ini terdapat banyak kesalahan, baik dalam segi penulisan, pembahasan, dan penyusunannya yang kurang rapi. Maka dari itu besar harapan penulis semoga artikel ini dapat bermanfaat bagi penulis dan orang lain. 8 Desember 2018 BAB...

RELASI - MATEMATIKA DISKRIT

TI Politala Matdis 1B KATA PENGANTAR Puji dan syukur penulis panjatkan kehadirat Allah SWT. Karena dengan Rahmat dan Karunia-Nya, penulis dapat menyelesaikan pembuatan artikel dengan judul “Relasi” hingga selesai . Dengan diberikannya tugas pembuatan artikel di sebuah blog, mahasiswa diharapkan mampu mempelajari lebih banyak lagi materi mengenai relasi, dan mampu menyelesaikan tugas mata kuliah matematika diskrit yang diberikan oleh dosen . Semoga dengan pembuatan artikel ini dapat bermanfaat khususnya bagi penulis selaku mahasiswa dan umumnya bagi kita semua. Selanjutnya penulis, merasa bahwa artikel relasi ini jauh dari kesempurnaan. Oleh sebab itu, penulis mohon maaf sebesar-besarnya apabila dalam penyusunan artikel ini terdapat banyak kesalahan, baik dalam segi penulisan, pembahasan, dan penyusunannya yang kurang rapi. Maka dari itu besar harapan penulis semoga artikel ini dapat bermanfaat bagi penulis dan orang lain. 13 Oktober 2018     ...