Queue merupakan jenis Linked list yang menerapkan konsep FIFO (First In First Out) atau kebalikan dari Stack (LIFO). pada Queue elemen yang dimasukkan pertama kali apabila dilakukan pemrosesan makan elemen tersebut yang akan diproses terlebih dahulu. ilustrasinya menyerupai dikala kita akan membeli tiket di Bioskop, disitu orang yang tiba untuk mengantri pertama kali akan dilayani terlebih dahulu dan yang mengantri terakhir akan dilayani terakhir.
Terdapat 2 Operasi dasar dari Queue:
- Enqueue: proses penambahan elemen di posisi belakang
- Dequeue: proses pengambilan elemen di posisi depan Selain operasi dasar di atas,
Dalam Implementasinya terdapat 3 Alternatif Implementasi dalam Queue:
Queue Alternatif 1:
Queue Alternatif 2:
Queue Alternatif 3:
Contoh Program Queue dalam Bahasa C
Link Download: (Queue Alternatif 1, Alternatif 2, Alternatif 3, Teori)
Queue Alternatif 1:
drvqueue1.c
#include "queue1.h"
int main()
{
int max,i,x,y,j;
Queue F;
printf("======================================\n");
printf("===== Program Queue Alternatif 1 =====\n");
printf("======================================\n\n");
printf("Input Max element dari queue F : "); scanf("%d",&max);
CreateEmpty(&F,max);
printf("IsFull? %d\n",IsFull(F));
printf("IsEmpty? %d\n\n",IsEmpty(F));
printf("Inputkan jumlah elemen yang akan dimasukkan : ");
scanf("%d",&j);
for(i=1;i<=j;i++){
printf("Input nilai [%d] : ",i); scanf("%d",&x);
Add(&F,x);
}
printf("\nIsi F: \n");
printf("\nCek posisi HEAD : %d\n",F.Head);
printf("Cek posisi TAIL : %d\n",F.Tail);
printf("Cek jumlah elemen : %d\n",NBElmt(F));
printf("IsFull? %d\n",IsFull(F));
printf("IsEmpty? %d\n",IsEmpty(F));
printf("\nElemen pertama keluar (First In First Out)....\n");
Del(&F,&y);
printf("Nilai yang keluar yaitu : %d\n",y);
printf("\nIsi F: \n");
printf("\nCek posisi HEAD : %d\n",F.Head);
printf("Cek posisi TAIL : %d\n",F.Tail);
printf("IsFull? %d\n",IsFull(F));
printf("IsEmpty? %d\n",IsEmpty(F));
printf("Cek jumlah elemen : %d\n",NBElmt(F));
DeAlokasi(&F);
return 0;
}
queue1.c
#include "queue1.h"
boolean IsEmpty (Queue Q)
{
if(HEAD(Q)==Nil&&TAIL(Q)==Nil)
{
return true;
}else{
return false;
}
}
boolean IsFull (Queue Q)
{
if(HEAD(Q)==1&&TAIL(Q)==MaxEl(Q))
{
return true;
}else{
return false;
}
}
int NBElmt (Queue Q)
{
int jumlah;
if(IsEmpty(Q))
{
jumlah=0;
}else{
jumlah=TAIL(Q);
}
return jumlah;
}
void CreateEmpty (Queue *Q, int Max)
{
(*Q).T=(infotype *)malloc((Max+1)*sizeof(infotype *)); //mengalokasikan memori untuk q.t sebanyak max+1
if ((*Q).T != NULL) //jika berhasil maka maxel di isi maxnya head&tail dibentuk nil
{
MaxEl(*Q) = Max;
HEAD(*Q)=Nil;
TAIL(*Q)=Nil;
}else{ //kalo gagal maxel dibentuk kosong/nil
MaxEl(*Q) = Nil;
}
}
void DeAlokasi (Queue *Q)
{
free((*Q).T); //membuat dealokasikan memori yang dipesan
MaxEl(*Q) = Nil; // maxelnya di nilkan atau dibentuk ke awalnya
}
void Add (Queue *Q, infotype X)
{
if(IsEmpty(*Q)) //kalo queue masih kosong maka pribadi diinputkan
{
HEAD(*Q)=1;TAIL(*Q)=1; //index/address head dan tail di set ke 1
InfoTail(*Q)=X; //q.t[q.tail]/(q.t[1])index yang pertama diisi elemen X
}else{ //jika *q tidak kosong maka dicek apakah queuenya penuh.
if(IsFull(*Q))
{
printf("\nQUEUEnya penuh...");
}else { //jika tidak TAIL(Q)(q.tail) ditambah/diincrementkan
TAIL(*Q)++;
InfoTail(*Q)=X; // sehabis TAIL(Q) di incrementkan maka infotail(Q) diisikan elemen
}
}
}
void Del (Queue *Q, infotype *X)
{
int i;
if(IsEmpty(*Q)) //jika kosong maka infokan ke user
{
printf("\nQUEUEnya Kosong...");
}else{ //jika tidak maka infohead(q)/elemen pertama queue disimpan sementara ke variabel *X
(*X)=InfoHead(*Q); //TAILnya dikkurangi/decrementkan
TAIL(*Q)--;
if(TAIL(*Q)==0) //jika sehabis didecrementkan tailnya kosong maka headnya dibentuk kosong juga
{
HEAD(*Q)=0;
}else{ //kl tidak maka isi queue dari head+1 hingga tail digeser ke kiri
i=1;
while(i<=TAIL(*Q))
{
(*Q).T[i]=(*Q).T[i+1];
i++;
}
}
}
}
queue1.h
#ifndef QUEUE1_H_INCLUDED
#define QUEUE1_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include "boolean.h"
#define Nil 0
typedef int infotype;
typedef int address;
typedef struct{
infotype *T;
address Head;
address Tail;
int MaxEl;
}Queue;
/********** AKSES (Selektor) **********/
/* Jika Q yaitu Queue, maka saluran elemen : */
#define HEAD(Q) (Q).Head
#define TAIL(Q) (Q).Tail
#define InfoHead(Q) (Q).T[(Q).Head]
#define InfoTail(Q) (Q).T[(Q).Tail]
#define MaxEl(Q) (Q).MaxEl
boolean IsEmpty (Queue Q);
boolean IsFull (Queue Q);
int NBElmt (Queue Q);
void CreateEmpty (Queue *Q, int Max);
void DeAlokasi (Queue *Q);
void Add (Queue *Q, infotype X);
void Del (Queue *Q, infotype *X);
#endif // QUEUE1_H_INCLUDED
Link Download: (Queue Alternatif 1, Alternatif 2, Alternatif 3, Teori)
Sekian artikel perihal Queue dalam Bahasa C, agar artikel ini sanggup bermanfaat bagi teman MARKIJAR.
Queue (Antrian) dalam Bahasa C
MARKIJAR: MARi KIta belaJAR