Anda di halaman 1dari 9

Queue (Antrian)

Queue / Antrian adalah suatu kumpulan data yang mana penambahan elemen hanya bisa
dilakukan pada satu ujung (disebut dengan sisi belakang atau tail/rear) dan penghapusan atau
pengambilan elemen dilakukan lewat ujung lain (disebut dengan sisi depan atau head/front).
Antrian menggunakan prinsip Pertama Masuk Pertama Keluar – First In First Out
(FIFO). Dengan kata lain urutan masuk sama dengan urutan keluar. Antrian banyak dijumpai
dalam kehidupan sehari-hari. Mobil-mobil yang mengantri digerbang tol untuk membeli karcis
tol; orang-orang yang mengantri di loket untuk membeli karcis film juga membentuk antrian.
Elemen yang pertama kali masuk ke antrian akan keluar pertama kalinya. DEQUEUE
adalah mengeluarkan satu elemen dari suatu antrian. Terdapat satu buah pintu masuk di suatu
ujung dan satu buah pintu keluar di ujung satunya sehingga membutuhkan variabel Head dan
Tail.
1. Deklarasi Antrian dengan array
Proses pendeklarasi antrian adalah proses pembuatan struktur antrian dalam memori. Struktur
antrian terdiri dari data dalam array, head untuk menunjukkan ujung antrian dan tail untuk
menunjukkan akhir antrian.
#define MAX 6

struct Queue
{
int data[MAX];
int head;
int tail;
};

2. Inisialisasi
Inisialisasi antrian adalah proses pembuatan suatu antrian kosong. Proses inisialisasi untuk
antrian yang menggunakan array adalah dengan mengisi nilai field head dan tail dengan 0
(nol) jika elemen pertama diawali dengan nomor 1. Kalau elemen pertama array dimulai
dengan 0 maka head dan tail diisi dengan nilai -1.
void Create()
{
antrian.head=antrian.tail=-1;
}

3. Operasi cek kosong


Operasi ini digunakan untuk memeriksa apakah antrian dalam keadaan kosong. Operasi ini
penting dilakukan dalam proses Dequeu. Ketika suatu antrian dalam keadaan kosong, maka
proses Dequeue tidak bisa dilakukan. Operasi ini dilakukan dengan memeriksa tail. Jika tail
bernilai -1, maka berarti antrian dalam keadaan empty (kosong).
int IsEmpty()
{
if(antrian.tail==-1)
return 1;

1
else
return 0;
}

4. Operasi cek penuh


Operasi ini berguna untuk memeriksa keadaan antrian apakah sudah penuh atau belum.
Operasi ini akan memberikan nilai true (1) jika field tail sama dengan size-1.
int IsFull()
{
if(antrian.tail==MAX-1)
return 1;
else
return 0;
}

5. Operasi Enqueue
Operasi ini berguna untuk menambah suatu elemen data baru pada antrian dan disimpan pada
posisi head dan tail yang akan mengakibatkan posisi tail akan berubah. Langkah operasi ini
adalah :
a. Periksa apakah kosong. Jika kosong maka ubah posisi head dan tail pada posisi 0,
kemudian masukkan datanya.
b. Jika antrian tidak kosong maka naikkan posisi tail sebesar 1, kemudian masukkan
datanya.
void Enqueue(int data)
{
if(IsEmpty()==1)
{
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
cout<<antrian.data[antrian.tail];
}
else
{
antrian.tail++;
antrian.data[antrian.tail]=data;
cout<<antrian.data[antrian.tail];
}

6. Operasi Dequeue
Operasi ini berguna untuk mengambil elemen pertama (head) dari antrian. Penghapusan
dilakukan dengan cara mengurangi counter Tail dan menggeser semua elemen antrian
kedepan. Penggeseran dilakukan dengan menggunakan looping

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];
}

2
antrian.tail--;
return e;
}

7. Operasi Clear
Digunakan untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head =
-1. Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun
hanya mengeset indeks pengaksesan-nya

void Clear()
{
antrian.head=antrian.tail=-1;
cout<<"Data Clear";
}

8. Operasi Tampil
Digunakan untuk menampilkan nilai-nilai elemen antrian. Proses menampilkan data dalam
antrian dilakukan dengan menggunakan looping dari head s/d tail
void Tampil()
{
if (IsEmpty()==0)
for (int i=antrian.head;i<=antrian.tail; i++)
cout<<antrian.data[i]<<" ";
else
cout<<"Data Kosong\n";
}

Program Lengkap:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define MAX 6

struct Queue
{
int data[MAX];
int head;
int tail;
};

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;
}

3
void Enqueue(int data)
{
if(IsEmpty()==1)
{
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
cout<<antrian.data[antrian.tail];
}
else
//kodisi lainnya jika penuh() sama dengan 0 maka antrian.ekor ditambah 1
{
antrian.tail++;
antrian.data[antrian.tail]=data;
cout<<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;
cout<<"Data Clear";
}

void Tampil()
{
if (IsEmpty()==0)
for (int i=antrian.head;i<=antrian.tail; i++)
cout<<antrian.data[i]<<" ";
else
cout<<"Data Kosong\n";
}

void main()
{
int pil;
int data;
Create();
do
{
clrscr();
cout<<"\n============MENU PILIHAN============\n";
cout<<"1. Enqueue\n";
cout<<"2. Dequeue\n";
cout<<"3. Tampil\n";
cout<<"4. Clear\n";
cout<<"5. Keluar\n";
cout<<"--------------------------------------\n";
cout<<"Masukkan Pilihan Anda -> ";
cin>>pil;

switch(pil)
{
case 1:

4
cout<<"Data : ";cin>>data;
Enqueue(data);
break;
case 2:
if (IsEmpty()==0)
cout<<"Elemen yang keluar : "<<Dequeue();
else
cout<<"Data kosong"<<endl;
break;
case 3:
Tampil();
break;
case 4:
Clear();
break;
case 5:
break;
}
getch();
} while(pil!=5);
}

5
Queue dengan Pointer
Proses penyimpanan elemen queue dalam pointer mirip dengan operasi pada single linked list
yang menggunakan penyimpanan tambah akhir dan hapus awal.
Operasi-operasi yang dapat dilakukan dalam queue yang menggunakan representasi linked list
adalah :
1. Pendeklarasian sebuah queue
Setiap queue memiliki elemen-elemen (field) berupa posisi depan, posisi belakang, elemen
antrian, dan posisi penunjuk ke elemen berikutnya. Berikut ini adalah pendeklarasian queue yang
disimpan dengan pointer.
struct node
{
int info;
struct node *next;
};
node *head,*tail,*newnode,*ptr;

2. Inisialisasi Queue
Proses inisialisasi queue yang disimpan dalam pointer adalah dengan memberikan nilai NULL
ke pointer head dan tail yang menandakan bahwa pointer depan dan belakang belum menunjuk
ke 1 elemen apapun.
void inisialisasi()
{
head=NULL;
tail=NULL;
}

3. Fungsi Cek Isi


Fungsi ini berguna untuk memeriksa apakah suatu queue dalam keadaan isi atau kosong. Fungsi
ini berguna ketika proses dequeue yaitu ketika sebuah elemen akan diambil, maka harus
diperiksa dulu apakah memiliki data atau tidak. Fungsi ini akan mempunyai nilai benar jika
depan atau belakang bernilai NULL.
Implementasinya dalam bahasa C adalah :
int cekIsi()
{
if((head==NULL)&&(tail==NULL))
{
cout<<"\nAntrian kosong";
return(0);
}
else
{
return(1);
}
}

4. Operasi Enqueue
Proses enqueue adalah dengan menambahkan elemen baru ke posisi paling belakang
(sambungkan field berikutnya dari field belakang ke posisi pointer baru). Setelah itu, pointer

6
penunjuk belakang harus berpindah ke posisi baru tersebut. Proses ini seperti proses penambahan
di belakang pada single linked list.
void enqueue(int item)
{
newnode = new(node);
newnode->info=item;

if((head==NULL)&&(tail==NULL))
{
head=newnode;
tail=newnode;
newnode->next=NULL;
}
else
{
tail->next=newnode;
newnode->next=NULL;
tail=newnode;
}
}

5. Operasi Dequeue
Proses dequeue adalah dengan mengambil data yang ditunjuk pointer depan dan kemudian
pointer yang depan tersebut diambil dan kemudian dihapus. Pointer depan harus berpindah ke
elemen antrian berikutnya. Proses tersebut dilakukan hanya jika linked list tidak kosong. Proses
ini mirip dengan proses penghapusan data awal pada single linked list.
Implementasinya dalam bahasa C adalah :
void dequeue()
{
if(head==tail)
{
head=NULL;
tail=NULL;
}
else
{
head=head->next;
}
}

Program Lengkap:
#include <stdio.h>
#include <conio.h>
#include <process.h>
#include <iostream.h>

struct node
{
int info;
struct node *next;
};
node *head,*tail,*newnode,*ptr;

void menu();
void tampil();
int cekIsi();
void enqueue(int);
void dequeue();
void inisialisasi()

7
{
head=NULL;
tail=NULL;
}
void main()
{
clrscr();
inisialisasi();
menu();
}

void menu()
{
int pilih,item;
cout<<"MENU";
cout<<"\n1. Tambah";
cout<<"\n2. Hapus";
cout<<"\n3. Tampil";
cout<<"\n4. Keluar";
cout<<"\nMasukkan pilihan: ";
cin>>pilih;
switch(pilih)
{
case 1:
clrscr();
cout<<"\nData yang anda masukkan: ";
cin>>item;
enqueue(item);
clrscr();
cout<<"\nData dalam antrian:\n";
tampil();
getch();
clrscr();
menu();
break;
case 2:
clrscr();
if(cekIsi()==1)
{
dequeue();
if(cekIsi()==1)
{
cout<<"\nData dalam antrian:\n";
tampil();
}
}
getch();
clrscr();
menu();
break;
case 3:
clrscr();
if(cekIsi()==1)
{
cout<<"Data dalam antrian:\n";
tampil();
}
getch();
clrscr();
menu();
break;
case 4:
exit(1);
default:
clrscr();
cout<<"Pilihanmu salah\n\n";
menu();
}
}

8
int cekIsi()
{
if((head==NULL)&&(tail==NULL))
{
cout<<"\nAntrian kosong";
return(0);
}
else
{
return(1);
}
}

void enqueue(int item)


{
newnode = new(node);
newnode->info=item;

if((head==NULL)&&(tail==NULL))
{
head=newnode;
tail=newnode;
newnode->next=NULL;
}
else
{
tail->next=newnode;
newnode->next=NULL;
tail=newnode;
}
}

void dequeue()
{
if(head==tail)
{
head=NULL;
tail=NULL;
}
else
{
head=head->next;
}
}

void tampil()
{
int i;
ptr=head;
i=1;
while(ptr!=NULL)
{
cout<<"\nSimpul "<<i<<" : "<<ptr->info;
ptr=ptr->next;
i++;
}
}

Anda mungkin juga menyukai