[C++] Konsep Queue - nblognlife

[C++] Konsep Queue

[C++] - Contoh Program Queue

     Pada struktur data  Queue atau antrian adalah sekumpulan data yang mana  penambahan elemen hanya bisa dilakukan pada suatu ujung disebut dengan sisi belakang (rear), dan penghapusan (pengambilan elemen) dilakukan lewat ujung lain (disebut dengan sisi depan atau front). 

Pada Stack atau tumpukan menggunakan prinsip “Masuk terakhir keluar pertama”atau LIFO (Last In First Out), Maka pada Queue atau antrian prinsip yang digunakan adalah “Masuk Pertama Keluar Pertama” atau FIFO (First In First Out).

Queue atau antrian banyak kita jumpai dalam kehidupan sehari-hari, ex: antrian Mobil diloket Tol, Antrian mahasiswa Mendaftar, dll. Contoh lain dalam bidang komputer adalah pemakaian sistem komputer berbagi waktu(time-sharing computer system) dimana ada sejumlah pemakai yang akan menggunakan sistem tersebut secara serempak.

Pada Queue atau antrian Terdapat satu buah pintu masuk di suatu ujung dan satu buah pintu keluar di ujung satunya dimana membutuhkan variabel Head dan Tail (depan/front, belakang/rear).

Operasi-operasi Queue :
1. Create()
Untuk menciptakan dan menginisialisasi Queue

2. IsEmpty()
Untuk memeriksa apakah Antrian masih kosong
 
3. IsFull()
Untuk mengecek apakah Antrian sudah penuh atau belum
 
4. Enqueue ()
Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang

5. Dequeue()
Digunakan untuk menghapus elemen terdepan/pertama (head) dari Antrian
 
6. Clear()
Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1
 
7. Tampil()
Untuk menampilkan nilai-nilai elemen Antrian

Syntax Program : 
//header file
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
# define QSIZE 5

//deklarasi struct
typedef struct
{
      int count;
    int head,tail;
    char names[QSIZE][30];
}QUEUE; //nama struct

//deklarasikan prototype fungsi
char *enqueue(char *);
char *dequeue();
void tampil();
void inisialisasi();

//deklarasi Node
QUEUE *pq;

//fungsi main
int main()
{
      //deklarasi variabel
      int pil;
      char str[30];
      QUEUE q;
      pq=&q;
      inisialisasi(); //panggil fungsi inisialisasi
      do{
            system("cls"); //bersihkan layar
            printf("\tMENU PILIHAN : ");
            printf("\n\t______________");
            printf("\n[1] Input Data");
            printf("\n[2] Delete Data");
            printf("\n[3] Show data in queue");
            printf("\n[4] Exit\n");
            printf("\nPilihan anda : ");
            scanf("%d",&pil);
            switch(pil){
            case 1:
                  printf("\nSilahkan memasukkan sebuah kata : ");
                  fflush(stdin); //menghapus buffer data
                  gets(str);
                 puts(enqueue(str)); /*Mencetak string hasil penambahan data yang dilakukan oleh fungsi enqueue()*/
                  break;
            case 2:
                 puts(dequeue()); /*Mencetak string terhapus yang dilakukan oleh fungsi enqueue()*/
                  break;
            case 3:
                  tampil(); //panggil fungsi tampil()
                  break;
            case 4: exit(0);
            default: printf("\nMasukkan anda salah!!");
            }
            printf("\nPress Any Key to continue...");
            fflush(stdin); //membersihkan buffer data
            while(!kbhit());
      }
      while(1); //perulanagan dijalankan terus
    //return 0;
}

//fungsi untuk inisialisasi awal
void inisialisasi()
{
      pq->head = pq->tail = pq->count= 0;
}

//fungsi untuk menambah data string dalam queue
char* enqueue(char *p)
{
      if(pq->count==QSIZE)
            return "\n\n\t\t Error: Antrian penuh";
      pq->tail= (pq->tail)%QSIZE;
      strcpy(pq->names[(pq->tail)++],p);
      pq->count++;
      return "Data telah berhasil dimasukkan";
}

//fungsi untuk menghapus data string dalam queue
char* dequeue()
{
      if(pq->count==0)
            return "\n\n\t\t Error: Antrian kosong";
      pq->head= (pq->head)%QSIZE;
      pq->count--;
      printf("\nData yang telah dihapus adalah\n:");
      return pq->names[(pq->head)++];
}

//fungsi untuk menampilkan data yang berada dalam antrian
void tampil()
{
      int i=pq->head;
      int x=0;
      if(pq->count==0)
            printf("Antrian kosong\n");
      else
      {
            while(x<pq->count)
            {
                  if(i==QSIZE)
                        i%=QSIZE;
                  printf(":%s\n",pq->names[i]);
                  i++;
                  x++;
            }
      }
}

Penjelasan dan algoritma :
1) Pada awalnya dibuat sebuah struct bernama QUEUE dan dibuat beberapa fungsi yang difunakan untuk pemrosesan data, serta juga dideklerasikan sebuah node.

2) Masuk fungsi main, deklarasikan variabel
   int pil;
   char str[30];
   QUEUE q;
   pq=&q;

inisialisasi(); //panggil fungsi inisialisasi
Kemudian panggil fungsi inisialisasi,
Fungsi Inisialisasi :
                                       void inisialisasi()
   {
                         pq->head = pq->tail = pq->count= 0;
                     }
Saat fungsi dipanggil maka fungsi akan memberikan nilai awal 0 pada variabel pq->head, pq->tail, pq->count;

3) Masuk menu perulangan, tampilkan menu pilihan dan minta user menginput pilihan yang diiinginkan.
- Jika input user == 1
Maka semua pernyataan yang berada di dalam case ke 1 akan dijalankan,
printf("\nSilahkan memasukkan sebuah kata : ");
         fflush(stdin);//menghapus buffer data
         gets(str);
      puts(enqueue(str)); /*Mencetak string hasil penambahan data yang dilakukan oleh fungsi enqueue()*/
         break;
       User diminta untuk menginputkan suatu string, string yang diinput user disimpan dalam variabel str melalui fungsi gets(get string).
       Setelah string selesai dimasukkan. Kemudian program akan memanggil fungsi  enqueue(str) dan kemudian mencetak nilaibalik yang berada dalam fungsi tersebut.
Fungsi enqueue(str) :
                       char* enqueue(char *p)
           {
               if(pq->count==QSIZE)
               return "\n\n\t\t Error: Antrian penuh";
               pq->tail= (pq->tail)%QSIZE;
               strcpy(pq->names[(pq->tail)++],p);
               pq->count++;
            return "Data telah berhasil dimasukkan";
}
Fungsi ini digunakan untuk menambahkan data baru pada suatu antrian.
-          Lakukan pengecekan kondisi, bandingkan nilai pq->count dengan QSIZE è (0==5)?, kondisi tidak terpenuhi baikan pernyataan yang berada di dalam operasi kondisi if.
-          Lakukan proses inisialisasi terhadap pq->tail
pq->tail = 0%5;
         = 0;
-          strcpy(pq->names[(pq->tail)++],p);
Untuk mengcopy string yang diinputkan pada suatu array untuk penyimpanan yaitu pq-> names[1].

-          Setelah proses penyimpanan data selesai, increment nilai pq->count++, kemudian jalankan fungsi return, Tampilkan hasil pemanggilan fungsi return ke layar “Data telah berhasil dimasukkan”.  


- Jika input user == 2
Maka semua pernytaan yang berada di dalam case ke 2 akan dijalankan,
          puts(dequeue()); /*Mencetak string terhapus yang ilakukan oleh fungsi enqueue()*/
             break;
Program akan memanggil fungsi dequeue() kemudian akan mencetak nilai baliknya ke layar.
Fungsi dequeue ():
char* dequeue()
{
      if(pq->count==0)
            return "\n\n\t\t Error: Antrian kosong";
      pq->head= (pq->head)%QSIZE;
      pq->count--;
      printf("\nData yang telah dihapus adalah\n:");
      return pq->names[(pq->head)++];

}
   -  Fungsi ini digunakan untuk menghapus data yang pertama kali dimasukkan. Sebelum melakukan proses penghapusan akan dilakukan pengecekan pq->count==0 è (1==0), kondisi salah maka pernyataan yang berada di dalam operasi kondisi if diabaikan dan langsung mengeksekusi pernyataan lain yang berada di luar operasi kondisi.
   -  Lakukan proses inisialisasi terhadap pq->head
              pq->head = 0%5;
                       = 0;
   -  Decrement nilai pq->count--;. Sekarang nilai yang awalnya 1 menjadi 0
   -  Tampilkan String ke layar "Data yang telah dihapus adalah”. Kemudian jalankan fungsi return, fungsi return akan memberikan nilai balik berupa data yang berada pada array
              pq->names[(pq->head)++];
              pq->names[1];
         
               Fungsi return akan menampilkan nilai balik berupa data yang berada di dalam index pertama, yaitu data yang kita inputkan diawal melalui fungsi enqueue() yang dijalankan saat user menginputkan nilai 1 pada saat ditampilkan menu pilihan.

- Jika input user ==3
Maka semua pernyataan yang berada pada case ke 3 akan dijalankan,
                  tampil(); //panggil fungsi tampil()
                  break;
Program akan memanggil fungsi tampil (),
Fungsi tampil() :
                       void tampil()
{
      int i=pq->head;
      int x=0;
      if(pq->count==0)
            printf("Antrian kosong\n");
      else
      {
            while(x<pq->count)
            {
                  if(i==QSIZE)
                        i%=QSIZE;
                  printf(":%s\n",pq->names[i]);
                  i++;
                  x++;
            }
      }
}    
    - Awalnya akan dilakukan proses pemberian nilai pada variabel yang telah dideklarasiakan,
int i=pq->head; è i = 0
x = 0;

    - Jalankan Operasi kondisi, cek apakah pq->count==0 è 0==0, kondisi benar, berarti tidak ada data yang sedang berada di dalam queue/antrian. Jadi akan dicetak string ke layar “Antrian kosong”.
               Seandainya kondisi pertama salah, maka kondisi kedua akan dijalankan. Masuk ke pernyatan while ulang terus selama kondisi x<pq->count . Jika benar maka pernyataan yang berada di dalam while akan diulang

    - Masuk dalam pernyataan while, lakuakn pengecekan kondisi i==QSIZE, jika benar maka decrement nilai variabel i menjadi sisa pembagian i dengan QSIZE. Jika kondisi salah maka cetak ke layar semua string yang telah tersimpan dalam indek array pq->names[].
                         
   -  Selanjutnya lakukan increment pada variabel i dan x.

- Jika input user ==4
   - Maka semua pernyatan yang berada dalam case ke 4 akan dijalankan,
                               exit(0);
             Pernyataan exit(0) digunakan untuk keluar dari program. Jika user memilih menu ke 4 maka akan keluar dari program.
            
- Jika input user!={1,2,3,4}
   - Maka default dan pernytaan yang didalamnya akan dijalankan,
                              printf("\nMasukkan anda salah!!");
     Jika input yang kita masukkan salah makaprogram akan menampilkan string “Masukan Anda salah”.
      
4) Setelah pernytaan case dijalankan, program akan melakukan pengulangan terus-menerus, karena kondisi while disetel selalu bernilai benar. Kecuali jika input user adalah 4.


Output : 
Input data (Rachmat, Santoso, nblognlife)
      MENU PILIHAN :
      ______________
[1] Input Data
[2] Delete Data
[3] Show data in queue
[4] Exit

Pilihan anda : 1

Silahkan memasukkan sebuah kata : Rachmat
Data telah berhasil dimasukkan

Press Any Key to continue...
      MENU PILIHAN :
      ______________
[1] Input Data
[2] Delete Data
[3] Show data in queue
[4] Exit

Pilihan anda :
1

Silahkan memasukkan sebuah kata : Santoso
Data telah berhasil dimasukkan

Press Any Key to continue...
      MENU PILIHAN :
      ______________
[1] Input Data
[2] Delete Data
[3] Show data in queue
[4] Exit

Pilihan anda :
1

Silahkan memasukkan sebuah kata : nblognlife
Data telah berhasil dimasukkan

Press Any Key to continue...

Delete data
      MENU PILIHAN :
      ______________
[1] Input Data
[2] Delete Data
[3] Show data in queue
[4] Exit

Pilihan anda :
2

Data yang telah dihapus adalah
:Rachmat

Press Any Key to continue...

Show data
      MENU PILIHAN :
      ______________
[1] Input Data
[2] Delete Data
[3] Show data in queue
[4] Exit

Pilihan anda :
3
:Santoso
:nblognlife

Press Any Key to continue...


[RS]

Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?

Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).

Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.

Terima kasih