Langsung ke konten utama

Program Queue Menggunakan C++

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 :

Dari bilangan desimal 25 dikonversikan menjadi biner menjadi 11001

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