Rabu, 20 Maret 2019

ALGORITMA DAN PEMROGRAMAN 2 "QUEUE"

Posted by angel's note on Maret 20, 2019 with No comments
Materi Queue (Antrian)

Pengertian Queue

Queue atau antrian merupakan suatu kumpulan data yang memiliki head/front dimana data dikeluarkan dan tali/rear dimana data dimasukkan. Aturan utama dalam konsep queue adalah FIFO yang merupakan singkatan dari First In First Out, artinya adalah data yang pertama kali dimasukkan atau disimpan, maka data tersebut adalah yang pertama kali akan diakses atau dikeluarkan. Analoginya sama dengan antrian di sebuah  di bank, orang yang datang lebih dahulu, maka akan terlebih dahulu dilayani oleh teller, dan akan selesai lebih dulu daripada orang-orang yang datang setelahnya.
   
     
      Deklarasi Queue dengan Array

      Proses pendeklarasian antrian adalah proses pembuatan struktur antrian dalam memori. Struktur antrian terdiri dari data dalam array, head untuk menunjukkan ujung dari antrian dan tail untuk menunjukkan akhir dari antrian.

#define MAX 5

#include <iostream>

using namespace std;
typedef struct
{
    int data [MAX];
    int head;
    int tail;
}Queue;

      Inisialisasi Queue

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


Operasi Operasi Dasar dalam Queue

  1. .   Fungsi Create
    Sama pada stack, prosedur ini berfungsi untuk mengosongkan queue dengan cara meletakkan HEAD dan TAIL pada indeks array ke-(-1). Berikut deklarasi prosedur create pada queue:
    void create()
    {
       antrian.HEAD = -1;
       antrian.TAIL = -1;

    }
  2. Fungsi IsEmpty
    Sama seperti fungsinya pada stack, fungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut kosong atau tidak. Jika queue tersebut kosong (artinya, HEAD dan TAIL berada pada posisi -1, atau bisa juga ketika HEAD > TAIL), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak kosong/ berisi (artinya, HEAD dan TAIL tidak berada pada posisi -1), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsEmpty:
    int IsEmpty(){
       if(antrian.HEAD=antrian.TAIL==-1)
    return 1;
       else
    return 0;
    }
  3. Fungsi IsFull
    Fungsi ini berfungsi untuk melakukan pengecekan terhadap queue, apakah queue tersebut penuh atau tidak. Jika queue tersebut penuh (artinya, TAIL berada pada posisi MAX), maka fungsi akan mengembalikan nilai 1 (true), tetapi jika queue tersebut tidak penuh (artinya, TAIL tidak berada pada posisi MAX), maka fungsi akan mengembalikan nilai 0 (false). Berikut deklarasi fungsi IsFull dalam Bahasa C:
    int IsFull(){
       if (antrian.TAIL == max-1)
    return 1;
       else
    return 0;
    }
  4. Fungsi EnQueue
    Fungsi ini digunakan untuk memasukkan sebuah data / nilai ke dalam queue. Sebelum sebuah data / nilai dimasukkan ke dalam queue, maka prosedur ini terlebih dahulu melakukan pengecekan terhadap posisi HEAD dan TAIL. Jika posisi HEAD dan TAIL masih berada pada indeks ke-(-1) (artinya queue masih kosong), maka prosedur ini akan menempatkan HEAD dan TAIL pada indeks ke-0 terlebih dahulu, baru setelah itu memasukkan data / nilai ke dalam array data queue. Namun, jika posisi HEAD dan TAIL tidak berada pada posisi ke-(-1), maka posisi TAIL yang akan dinaikkan satu level. Jadi, pada proses enqueue, TAIL-lah yang berjalan seiring masuknya data baru ke dalam antrian, sedangkan HEAD akan tetap pada posisi ke-0. Berikut deklarasi prosedur EnQueue:
    void enqueue()
    {
       if (IsEmpty()){
         antrian.HEAD=antrian.TAIL=0;
         cout<<”Masukkan data : “;
         cin>>antrian.data[antrian.TAIL];
       }
       else
       if(IsFull()){
         cout<<”ANTRIAN SUDAH PENUH!”;
       }
    }
  5. Fungsi DeQueue
    Fungsi ini digunakan untuk mengeluarkan atau membuang sebuah data/ nilai yang paling awal masuk (yang berada pada posisi HEAD, yakni yang paling depan dari antrian) ke dalam queue. Pekerjaan yang dilakukan oleh fungsi ini adalah menaikkan nilai HEAD satu level. Jadi, setiap satu kali data dikeluarkan, maka posisi HEAD naik bertambah satu level. Misalkan HEAD berada pada indeks ke-0, maka ketika akan mengeluarkan/ menghapus data pada posisi paling depan (pada posisi HEAD), prosedur ini akan menaikkan posisi HEAD ke indeks array ke-1. Atau dengan cara menggeser semua elemen antrian kedepan dan mengurangi TAIL dengan 1 penggeseran dilakukan dengan menggunakan looping. Berikut deklarasi fungsi DeQueue:
    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;
    }
  6. Fungsi Clear
    Untuk menghapus elemen-elemen queue dengan cara membuat Tail dan Head= -1. Penghapusan elemen-elemen queue sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemen-elemen queue tidak lagi terbaca. Berikut deklarasi fungsi clear:
    void clear(){
       antrian.HEAD = -1;
       antrian.TAIL = -1
            cout<<"Antrian sudah dikosongkan! ";
         }
  7. Fungsi Tampil
    Untuk menampilkan nilai-nilai elemen queue menggunakan looping dari HEAD sampai dengan TAIL. Berikut deklarasi fungsi tampil:
                void Tampil(){
       if(IsEmpty()){
              cout<<"Antrian kosong! ";
            }
            else {
              for(i=antrian.HEAD;i<=antrian.TAIL;i++)
             cout<<"Data pada antrian ke "<<i<<" = "<<antian.data[i]<<endl;
            }
         }

Contoh Program Queue

Berikut adalah contoh dari program queue: 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 5
#include <iostream>
using namespace std;

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)//menginput sebah dta
{
    if(IsEmpty()==1)
    {
        antrian.head=antrian.tail=0;
        antrian.data[antrian.tail]=data;
        printf("%d Data Telah Masuk !",antrian.data[antrian.tail]);
    }
    else
    if(IsFull()==0)
    {
        antrian.tail=antrian.tail+1;
        antrian.data[antrian.tail]=data;
        printf("%d masuk !", 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;
    printf("Data Clear");
}
void Tampil()
{
    if (IsEmpty()==0)
    {
        for (int i=antrian.head;i<=antrian.tail; i++)
        {
            printf("%d ",antrian.data[i]);
        }
    }
    else
    {
        printf("Data Kosong\n");
    }
}
int main()
{
    int pil;
    int data;
    Create();
    do
    {
        system("cls");
        printf ("\n MENU PILIHAN PROGRAM QUEUE\n");
        printf ("1. Enqueue\n");
        printf ("2. Dequeue\n");
        printf ("3. Tampil\n");
        printf ("4. Clear\n");
        printf ("5. Keluar\n");
        printf ("Masukkan Pilihan Anda : ");
        scanf("%d",&pil);
        switch(pil)
        {
            case 1:
            printf("Data : ");
            scanf("%d",&data);
            Enqueue(data);
            break;
            case 2:
            printf("Elemen yang keluar : %d", Dequeue());
            break;
            case 3:
            Tampil();
            break;
            case 4:
            Clear();
            break;
            case 5:
            break;
        }
        getch();
    } while(pil!=5);
}


Referensi: 


0 komentar:

Posting Komentar