Queue (Antrian) merupakan konsep First In First Out (FIFO). Disini data yang disimpan pertama akan diambil lebih dahulu. Implementasi queue dapat menggunakan array atau linked list. Pada implementasi queue dengan array, kemungkinan queue bisa penuh. Namun, pada implementasi queue dengan linked list, queue tidak pernah penuh. Pada operasi Queue ini ada dua, yakni Enqueue dan Dequeue.
a. ILUSTRASI QUEUE (ENQUEUE)
Operasi Enqueue meletakkan elemen/item ke queue.
b. ILUSTRASI QUEUE (DEQUEUE)
Operasi Dequeue menghapus elemen/item dari queue.
Program Operasi Shift (Geser) Menggunakan Queue
Pada program ini, kita
akan menginputkan bilangan desimal dan jumlah shiftnya. Bilangan desimal tadi
akan di konversi ke bilangan biner, kemudian bilangan biner tersebut akan mengalami proses dequeue lalu di enqueue sebanyak shift. Berikut Source Code nya :
#include <stdio.h>
#include <math.h>
#define MAX 10
typedef int Itemtype;
typedef struct
{
Itemtype item[MAX];
int front;
int rear;
int count;
} Queue;
void Init(Queue* q)
{
q->count = 0;
q->front = 0;
q->rear = 0;
}
int isFull(Queue* q)
{
return q->count ==
MAX;
}
int isEmpty(Queue* q)
{
return q->count == 0;
}
void Enqueue(Queue* q, Itemtype x)
{
if
(isFull(q))printf("Queue Penuh\n");
else
{
q->item[q->rear] =
x;
q->rear =
++q->rear % MAX;
q->count++;
}
}
Itemtype Dequeue(Queue* q)
{
Itemtype tmp = -1;
if
(isEmpty(q))printf("Queue Is Full\n");
else
{
tmp =
q->item[q->front];
q->front =
++q->front % MAX;
q->count--;
}
return tmp;
}
Itemtype OpShift(Queue* q, int n, int s)
{
Itemtype tmp = 0;
while (n > 0)
{
Enqueue(q, n % 2);
n /= 2;
}
for (int i = 0; i < s;
i++)
Enqueue(q, Dequeue(q));
int e = 0;
while (!isEmpty(q))
{
tmp += Dequeue(q) *
pow(2.0, e);
e++;
}
return tmp;
}
void header()
{
printf("\n\n");
printf("\t\t+------------------------------------------------+\n");
printf("\t\t|
|\n");
printf("\t\t| -Program Operasi Shit Dengan Queue- |\n");
printf("\t\t|
|\n");
printf("\t\t+------------------------------------------------+\n\n\n");
}
int main()
{
header();
Queue queue;
Init(&queue);
int bil, shift;
printf("\t\tMasukkan
Bilangan Desimal\t\t: ");
scanf("%d",
&bil);
printf("\t\tMasukkan
Jumlah Shift\t\t\t: ");
scanf("%d",
&shift);
printf("\t\tBilangan
Desimal Setelah Shift Adalah\t: %d\n\n", OpShift(&queue, bil, shift));
return 0;
}
Maka setelah itu
program akan menampilkan output seperti berikut :
Pembahasan :
setelah dikonversikan, maka program di shift sebanyak 2x
11001 —> shift pertama, angka 1 yang terakhir di dequeue lalu di enqueue sehingga menjadi 11100
11100 —> shift kedua, angka 0 yang terakhir di dequeue lalu di enqueue sehingga menjadi 01110
setelah selesai menjadi bilangan biner 01110 akan dikonversikan menjadi desimal yaitu 14.
Program Bilangan
Desimal Angka Terakhir di Dequeue
#include <stdio.h>
#include <iostream>
#include <conio.h>
#define MAX
using namespace std;
typedef struct{
int data[MAX];
int front;
int rear;
}Queue;
Queue antrian;
void Create(){
antrian.front=antrian.rear=-1;
}
int IsEmpty(){
if(antrian.rear==-1)
return 1;
else
return 0;
}
int IsFull(){
if(antrian.rear==MAX-1)
return 1;
else
return 0;
}
Enqueue(int data)//memasukkan data
{
if(IsEmpty()==1)
{
antrian.front=antrian.rear=0;
antrian.data[antrian.rear]=data;
} else
if(IsFull()==0)
{
antrian.rear++;
antrian.data[antrian.rear]=data;
}
}
int Dequeue()//mengeluarkan data
{
int i;
int e = antrian.data[antrian.front];
for(i=antrian.front;
i<=antrian.rear-1;i++)
{
antrian.data[i]=antrian.data[i+1];
}
antrian.rear--;
return e;
}
void Clear()//menghapus data
{
antrian.front=antrian.rear=-1;
printf("CLEAR");
}
void Tampil()//menampilkan data
{
if(IsEmpty()==0)
{
for(int
i=antrian.front;i<=antrian.rear;i++)
{
printf("
%d",antrian.data[i]);
}
}else printf("data kosong!\n");
}
main()
{
int desimal, shift, hasil;
cout<<"Masukkan Bilangan Desimal\t=
";
cin>>desimal;
Enqueue (desimal);
cout<<"Masukkan Jumlah Shift\t\t=
";
cin>>shift;
hasil=desimal>>shift;
cout<<"Bilangan Desimal Setelah
Shift\t= "<<hasil;
}
Maka Program ini akan menampilkan
Output seperti berikut :
Pembahasan :
Dari bilangan desimal 25 dikonversikan menjadi biner menjadi 11001
Setelah dikonversikan, lalu di shift sebanyak 2
11001 —> shift pertama, angka 1 yang terakhir di dequeue menjadi 1100
1100 —> shift kedua, angka 0 yang terakhir di dequeue menjadi 110
Biner 110 dikonversi ke desimal menjadi desimal 6.
Komentar
Posting Komentar