Materi Queue (Antrian)
Pengertian Queue
Queue atau antrian merupakan suatu kumpulan data yang memiliki head/front dimana data dikeluarkan dan tali/rear dimana data dimasukkan. Aturan 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 di bank, orang yang datang lebih dahulu, maka akan terlebih dahulu dilayani oleh teller, dan akan selesai lebih dulu daripada orang-orang yang datang setelahnya.
Pengertian Queue
Queue atau antrian merupakan suatu kumpulan data yang memiliki head/front dimana data dikeluarkan dan tali/rear dimana data dimasukkan. Aturan 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 di bank, orang yang datang lebih dahulu, maka akan terlebih dahulu dilayani oleh teller, dan akan selesai lebih dulu daripada orang-orang yang datang setelahnya.
Deklarasi Queue dengan Array
Proses
pendeklarasian antrian adalah proses pembuatan struktur antrian dalam memori.
Struktur antrian terdiri dari data dalam array, head untuk menunjukkan ujung
dari antrian dan tail untuk menunjukkan akhir dari antrian.
#define
MAX 5
#include
<iostream>
using
namespace std;
typedef
struct
{
int data [MAX];
int head;
int tail;
}Queue;
Inisialisasi
Queue
Inisialisasi antrian
adalah proses pembuatan suatu antrian kosong. Proses inisialisasi untuk antrian
yang menggunakan array adalah dengan mengisi nilai field head dan tail dengan
nilai 0 (nol) jika elemen pertama diawali dengan nomor 1. Kalau elemen pertama
array dimulai dengan nilai 0 (nol) maka head dan tail diisi dengan nilai -1.
void Create()
{
antrian.head=antrian.tail=-1;
}
Operasi Operasi Dasar dalam Queue
- . Fungsi CreateSama pada stack, prosedur ini berfungsi untuk mengosongkan queue dengan cara meletakkan HEAD dan TAIL pada indeks array ke-(-1). Berikut deklarasi prosedur create pada queue:void create(){antrian.HEAD = -1;antrian.TAIL = -1;
} - Fungsi IsEmptySama seperti fungsinya pada stack, fungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut kosong atau tidak. Jika queue tersebut kosong (artinya, HEAD dan TAIL berada pada posisi -1, atau bisa juga ketika HEAD > TAIL), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak kosong/ berisi (artinya, HEAD dan TAIL tidak berada pada posisi -1), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsEmpty:int IsEmpty(){if(antrian.HEAD=antrian.TAIL==-1)return 1;elsereturn 0;}
- Fungsi IsFullFungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut penuh atau tidak. Jika queue tersebut penuh (artinya, TAIL berada pada posisi MAX), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak penuh (artinya, TAIL tidak berada pada posisi MAX), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsFull dalam Bahasa C:int IsFull(){if (antrian.TAIL == max-1)return 1;elsereturn 0;}
- Fungsi EnQueueFungsi ini digunakan untuk memasukkan sebuah data / nilai ke dalam queue. Sebelum sebuah data / nilai dimasukkan ke dalam queue, maka prosedur ini terlebih dahulu melakukan pengecekan terhadap posisi HEAD dan TAIL. Jika posisi HEAD dan TAIL masih berada pada indeks ke-(-1) (artinya queue masih kosong), maka prosedur ini akan menempatkan HEAD dan TAIL pada indeks ke-0 terlebih dahulu, baru setelah itu memasukkan data / nilai ke dalam array data queue. Namun, jika posisi HEAD dan TAIL tidak berada pada posisi ke-(-1), maka posisi TAIL yang akan dinaikkan satu level. Jadi, pada proses enqueue, TAIL-lah yang berjalan seiring masuknya data baru ke dalam antrian, sedangkan HEAD akan tetap pada posisi ke-0. Berikut deklarasi prosedur EnQueue:void enqueue(){if (IsEmpty()){antrian.HEAD=antrian.TAIL=0;cout<<”Masukkan data : “;cin>>antrian.data[antrian.TAIL];}elseif(IsFull()){cout<<”ANTRIAN SUDAH PENUH!”;}}
- Fungsi DeQueueFungsi ini digunakan untuk mengeluarkan atau membuang sebuah data/ nilai yang paling awal masuk (yang berada pada posisi HEAD, yakni yang paling depan dari antrian) ke dalam queue. Pekerjaan yang dilakukan oleh fungsi ini adalah menaikkan nilai HEAD satu level. Jadi, setiap satu kali data dikeluarkan, maka posisi HEAD naik bertambah satu level. Misalkan HEAD berada pada indeks ke-0, maka ketika akan mengeluarkan/ menghapus data pada posisi paling depan (pada posisi HEAD), prosedur ini akan menaikkan posisi HEAD ke indeks array ke-1. Atau dengan cara menggeser semua elemen antrian kedepan dan mengurangi TAIL dengan 1 penggeseran dilakukan dengan menggunakan looping. Berikut deklarasi 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;}
- Fungsi ClearUntuk menghapus elemen-elemen queue dengan cara membuat Tail dan Head= -1. Penghapusan elemen-elemen queue sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemen-elemen queue tidak lagi terbaca. Berikut deklarasi fungsi clear:void clear(){antrian.HEAD = -1;antrian.TAIL = -1cout<<"Antrian sudah dikosongkan! ";}
- Fungsi TampilUntuk menampilkan nilai-nilai elemen queue menggunakan looping dari HEAD sampai dengan TAIL. Berikut deklarasi fungsi tampil:void Tampil(){if(IsEmpty()){cout<<"Antrian kosong! ";}else {for(i=antrian.HEAD;i<=antrian.TAIL;i++)cout<<"Data pada antrian ke "<<i<<" = "<<antian.data[i]<<endl;}}
Contoh Program Queue
Berikut adalah contoh dari program queue:
#include
<stdio.h>
#include
<stdlib.h>
#include
<conio.h>
#define
MAX 5
#include
<iostream>
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)//menginput sebah dta
{
if(IsEmpty()==1)
{
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
printf("%d Data Telah Masuk !",antrian.data[antrian.tail]);
}
else
if(IsFull()==0)
{
antrian.tail=antrian.tail+1;
antrian.data[antrian.tail]=data;
printf("%d masuk !",
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("Data 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");
}
}
int
main()
{
int pil;
int data;
Create();
do
{
system("cls");
printf ("\n MENU PILIHAN PROGRAM
QUEUE\n");
printf ("1. Enqueue\n");
printf ("2. Dequeue\n");
printf ("3. Tampil\n");
printf ("4. Clear\n");
printf ("5. Keluar\n");
printf ("Masukkan Pilihan Anda :
");
scanf("%d",&pil);
switch(pil)
{
case 1:
printf("Data : ");
scanf("%d",&data);
Enqueue(data);
break;
case 2:
printf("Elemen yang keluar :
%d", Dequeue());
break;
case 3:
Tampil();
break;
case 4:
Clear();
break;
case 5:
break;
}
getch();
} while(pil!=5);
}
Referensi: