PERTEMUAN XIII
QUEUE
Queue
Secara harfiah queue dapat diartikan sebagai antrian. Queue atau Antrian merupakan kumpulan elemen dengan penyisipan dan penghapusan elemen yang dilakukan dari sisi/gerbang yang berbeda Berbeda dengan stack yang bersifat LIFO maka queue bersifat FIFO(First In First Out), yaitu data yang pertama masuk akan keluar terlebih dahulu dan data yang terakhir masuk akan keluar terakhir. Berikut ini adalah gambaran struktur data queue.
Elemen yang pertama kali masuk ke dalam queue disebut elemen depan (front/head of queue), sedangkan elemen yang terakhir kali masuk ke queue disebut elemen belakang (rear/tail of queue). Perbedaan antara stack dan queue terdapat pada aturan penambahan dan penghapusan elemen. Pada stack, operasi penambahan dan penghapusan elemen dilakukan di satu ujung. Elemen yang terakhir kali dimasukkan akan berada paling dekat dengan ujung atau dianggap paling atas sehingga pada operasi penghapusan, elemen teratas tersebut akan dihapus paling awal, sifat demikian dikenal dengan LIFO. Pada queue, operasi tersebut dilakukan di tempat yang berbeda. Penambahan elemen selalu dilakukan melalui salah satu ujung, menempati posisi di belakang elemen‐elemen yang sudah masuk sebelumnya atau menjadi elemen paling belakang. Sedangkan penghapusan elemen dilakukan di ujung yang berbeda, yaitu pada posisi elemen yang masuk paling awal atau elemen terdepan. Sifat yang demikian dikenal dengan FIFO.
Operasi‐operasi standar pada queue adalah:
1. membuat queue atau inisialisasi.
2. mengecek apakah queue penuh.
3. mengecek apakah queue kosong.
4. memasukkan elemen ke dalam queue atau InQueue (Insert Queue).
5. Menghapus elemen queue atau DeQueue (Delete Queue).
Disebut juga queue dengan model fisik, yaitu bagian depan queue selalu menempati posisi pertama array. Queue dengan linear array secara umum dapat dideklarasikan sebagai berikut:
Const
MaxQueue = {jumlah};
Type
TypeQueue = byte;
Var
Queue : Array[1..MaxQueue] of TypeQueuel
Head, Tail : Byte;
1. Create
berguna untuk menciptakan queue yang baru dan kosong yaitu dengan cara memberikan nilai awal (head) dan nilai akhir (tail) dengan nol (0). Nol menunjukan bahwa queue masih kosong.
Procedure Create;
Begin
Head := 0; Tail := 0;
End;
2. Empty
Function empty berguna untuk mengecek apakah queue masih kosong atau sudah berisi data. Hal ini dilakukan dengan mengecek apakah tail bernilai nol atau tidak, jika ya maka kosong.
Function Empty : Boolean;
Begin
If Tail = 0 then
Empty := true
Else
Empty := False;
End;
3. Full
Function Full : Boolean;
Begin
If Tail = MaxQueue then
Full := true
Else
Full := False
End;
4. EnQueue
Procedure EnQueue berguna untuk memasukkan 1 elemen ke dalam queue.
Procedure Enqueue(Elemen : Byte);
Begin
If Empty then
Begin
Head := 1;
Tail := 1;
Queue[head] := Elemen;
End
Else
If Not Full then
Begin
Inc(Tail);
Queue[tail] := Elemen;
End;
End;
5. DeQueue
Procedure DeQueue berguna untuk mengambil 1 elemen dari Queue, operasi ini sering disebut juga SERVE. Hal ini dilakukan dengan cara memindahkan semua elemen satu langkah ke posisi di depannya, sehingga otomatis elemen yang paling depan akan tertimpa dengan elemen yang terletak dibelakangnya.
Procedure DeQueue; Var I : Byte;
Begin
If Not Empty then
Begin
For I := Head to Tail‐1 do
Queue[I] := Queue[I+1];
Dec(Tail);
End;
End;
6. Clear
Procedure clear berguna untuk menghapus semua elemen dalam queue dengan jalan mengeluarkan semua elemen tersebut satu per satu sampai kosong dengan memanfaatkan procedure DeQueue.
Procedure Clear;
Begin
While
Not Empty then
DeQueue;
End;
Coding Queue
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#define max 10
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;
cout<<"data"<<antrian.data[antrian.tail]<<"Masuk!!!";
}
else if(IsFull()==0)
{
antrian.tail++;
antrian.data[antrian.tail]=data;
cout<<"data"<<antrian.data[antrian.tail]<<"Masuk!!!";
}
else if (IsFull()==1)
{
cout<<"Ruangan Penuh!!"<<endl;
cout<<data<<"Gak Bisa MAsuk!!!";
}
}
void Dequeue()
{
int i;
int e = antrian.data[antrian.head];
if(antrian.tail==-1)
{
cout<<"Gak ada antrian.. Data Kosong"<<endl;
}
else
{
for(i=antrian.head;i<antrian.tail-1;i++)
{
antrian.data[i]=antrian.data[i+1];
}
antrian.tail--;
cout<<"Data yang keluar lebih dulu ="<<e<<endl;
}
}
void clear()
{
antrian.head=antrian.tail=-1;
cout<<"Duh Lega, Ruangan jadi gak sumpek.."<<endl;
cout<<"Data Clear";
}
void tampil()
{
if(IsEmpty()==0)
{
cout<<"data dalam antrian"<<endl;
cout<<"================================";
cout<<endl;
for(int i=antrian.head;i<=antrian.tail;i++)
{
cout<<"| "<<antrian.data[i]<<" |";
}
}
else
{
cout<<"ga ada antrian.. Data Kosong";
}
}
void main()
{
int pil;
int data;
create();
do
{
clrscr();
cout<<"Implementasi antrian dengan struct"<<endl;
cout<<"=========================================";
cout<<endl;
cout<<"1. Enqueue"<<endl;
cout<<"2. Dequeue"<<endl;
cout<<"3. print"<<endl;
cout<<"4. clear"<<endl;
cout<<"5. exit"<<endl;
cout<<"Masukkan Pilihan anda :" ;
cin>>pil;
switch(pil)
{
case 1:
{
cout<<endl;
cout<<"data = ";
cin>>data;
Enqueue(data);
break;
}
case 2:
{
cout<<endl;
Dequeue();
break;
}
case 3:
{
cout<<endl;
tampil();
break;
}
case 4:
{
cout<<endl;
clear();
break;
}
}
getch();
}
while(pil!=5);
}
Hasil Output Queue
KESIMPULAN
Queue atau Antrian merupakan kumpulan elemen dengan penyisipan dan penghapusan elemen yang dilakukan dari sisi/gerbang yang berbeda.
queue mempunyai sifat FIFO ( First In Firs Out ) yaitu elemen yang pertama masuk akan keluar pertama juga.
Queue kosong/tidak diketahui jika menggunakan array maka ada penunjuk depan dan belakang yang di gunakan untuk menunjuk elemen posisi depan dan belakang.
MACAM MACAM OPERASI UNTUK MENGECEK QUEUE :
Operasi Inisialisasi
Operasi Queue kosong
Operasi queue penuh
Operasi mengosongkan queue
Operasi penyisipan elemen queue
Operasi penghapusan elemen queue
Operasi pencetakan isi queue
Kelemahan dari delete queue adalah setiap melakukan penghapusan harus diikuti dengan pergeseran dari setiap elemen yang ada dalam queue satu posisi depan. Bisa di atasi dengan dilakukan queue melingkar ( Circular queue ) yaitu suatu queue yang di buat seakan akan merupakan sebuah lingkaran