/* */
MEDIA PENDIDIKAN dan PEMBELAJARAN Ilmu Mantiq (Logika): Kaidah Berfikir yang Memelihara Akal, agar tidak terjadi Kerancuan dalam Berfikir.

Tuesday, January 18, 2022

STRUKTUR DATA QUEUE (ANTREAN)

LINK PUSH AND POP

 Data Structure and Algorithms – Queue

Antrean adalah struktur data abstrak, agak mirip dengan Tumpukan, tetapi tidak seperti tumpukan, antrean terbuka di kedua ujungnya. Salah satu ujungnya selalu digunakan untuk memasukkan data (enqueue) dan ujung lainnya digunakan untuk menghapus data (dequeue). Antrean mengikuti metodologi First-In-First-Out, yaitu item data yang disimpan terlebih dahulu akan diakses terlebih dahulu.


Contoh antrean pada dunia nyata dapat berupa jalan satu arah dengan satu jalur, di mana kendaraan masuk lebih dulu, keluar lebih dulu. Contoh pada dunia nyata lainnya dapat dilihat sebagai antrean di loket tiket dan halte bus.

Queue Representation

Seperti yang sekarang kita pahami dalam antrean, kita mengakses kedua ujungnya karena alasan yang berbeda. Diagram berikut di bawah ini menjelaskan representasi antrean sebagai struktur data.


Seperti di stack, antrean juga dapat diimplementasikan menggunakan Array, Linked-list, Pointers dan Structures. Demi kesederhanaan, kami akan mengimplementasikan antrean menggunakan array satu dimensi.

Operasi Dasar

Operasi antrean mungkin melibatkan menginisialisasi atau menentukan antrean, memanfaatkannya, dan kemudian menghapus sepenuhnya dari memori. Di sini kita akan mencoba memahami operasi dasar yang terkait dengan antrean.

enqueue () - menambahkan (menyimpan) item ke antrean.

dequeue () - hapus (akses) item dari antrean.

Beberapa fungsi yang diperlukan untuk membuat operasi antrean yang disebutkan di atas.

peek () - Mendapat elemen di depan antrean tanpa menghapusnya.

isfull () - Memeriksa apakah antrean penuh. isempty () - Memeriksa apakah antrean kosong. Dalam antrean, selalu dilakukan dequeue (atau mengakses) data, yang ditunjukkan oleh pointerdepan dan saat memasukkan (menyimpan) data dalam antrean, kami mengambil bantuan pointer belakang.

Pertama-tama, mari pelajari tentang fungsi pendukung antrean.

peek() : Fungsi ini membantu untuk melihat data di depan antrean. Algoritme fungsi peek () adalah sebagai berikut.

Algoritme

begin procedure peek

   return queue[front]

end procedure

Example

int peek() {
   return queue[front];
}

isfull()

Karena digunakan array dimensi tunggal untuk mengimplementasikan antrean, kami hanya memeriksa pointer belakang untuk mencapai MAXSIZE, untuk menentukan bahwa antrean sudah penuh. Jika kita mempertahankan antrean dalam daftar tertaut melingkar, algoritme akan berbeda. Algoritme dari fungsi isfull ().

Algorithm

begin procedure isfull
   if rear equals to MAXSIZE
      return true
   else
      return false
   endif
end procedure

 

Example

bool isfull() {
   if(rear == MAXSIZE - 1)
      return true;
   else
      return false;
}

isempty()

Algorithm

begin procedure isempty
   if front is less than MIN  OR front is greater than rear
      return true
   else
      return false
   endif
end procedure

 Jika nilai depan kurang dari MIN atau 0, memberitahu bahwa antrean belum diinisialisasi (kosong).

Example

bool isempty() {
   if(front < 0 || front > rear)
      return true;
   else
      return false;
}

 Operasi Enqueue

Antrean mempertahankan dua pointer data, depan dan belakang. Oleh karena itu, operasinya relatif sulit untuk diterapkan dibandingkan dengan stack.

Langkah-langkah berikut harus dilakukan untuk mengantrekan (menyisipkan) data ke dalam antrean.
Langkah 1 - Periksa apakah antrean sudah penuh.
Langkah 2 - Jika antrean penuh, menghasilkan kesalahan overflow dan keluar.
Langkah 3 - Jika antrean tidak penuh, naikkan pointer belakang untuk menunjuk ruang kosong berikutnya.
Langkah 4 - Tambahkan elemen data ke lokasi antrean, di mana mengarah ke bagian belakang.
Langkah 5 - Kembalikan Sukses.

Terkadang, juga diperiksa  apakah antrean diinisialisasi atau tidak, untuk menangani situasi yang tidak terduga.

Algoritme untuk operasi antrean

procedure enqueue(data)     
   if queue is full
      return overflow
   endif
     rear rear + 1
   queue[rear] data
   return true
end procedure

 Example

int enqueue(int data)     
   if(isfull())
      return 0;
   rear = rear + 1;
   queue[rear] = data;  
   return 1;
end procedure

 

Operasi Dequeue

Mengakses data dari antrean ada dua proses: - mengakses data di mana pointer menunjuk bagian depan dan menghapus data setelah akses. Langkah-langkah berikut diambil untuk melakukan operasi dequeue -

Langkah 1 - Periksa apakah antrean kosong.
Langkah 2 - Jika antrean kosong,  keluar.
Langkah 3 - Jika antrean tidak kosong, akses data bagian depan.
Langkah 4 - Pointer depan naikkan satu step untuk menunjuk ke elemen data berikutnya yang tersedia.
Langkah 5 - Return sukses.

Algorithm operasi dequeue

procedure dequeue
      if queue is empty
      return underflow
   end if
   data = queue[front]
   front front + 1
   return true
end procedure

 

Example

int dequeue() {
   if(isempty())
      return 0;
   int data = queue[front];
   front = front + 1;
   return data;
}


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX 6
int intArray[MAX];
int front = 0;
int rear = -1;
int itemCount = 0;
int peek() {
   return intArray[front];
}
 
bool isEmpty() {
   return itemCount == 0;
}
 bool isFull() {
   return itemCount == MAX;
}
 
int size() {
   return itemCount;
} 
 
void insert(int data) {
 
   if(!isFull()) {
        if(rear == MAX-1) {
         rear = -1;           
      }      
      intArray[++rear] = data;
      itemCount++;
   }
}
 
int removeData() {
   int data = intArray[front++];      
   if(front == MAX) {
      front = 0;
   }     
   itemCount--;
   return data; 
}
 
int main() {
   /* insert 5 items */
   insert(3);
   insert(5);
   insert(9);
   insert(1);
   insert(12);
 
   // front : 0
   // rear  : 4
   // ------------------
   // index : 0 1 2 3 4
   // ------------------
   // queue : 3 5 9 1 12
   insert(15);
 
   // front : 0
   // rear  : 5
   // ---------------------
   // index : 0 1 2 3 4  5
   // ---------------------
   // queue : 3 5 9 1 12 15
      
   if(isFull()) {
      printf("Queue is full!\n");  
   }
   // remove one item
   int num = removeData();     
   printf("Element removed: %d\n",num);
   // front : 1
   // rear  : 5
   // -------------------
   // index : 1 2 3 4  5
   // -------------------
   // queue : 5 9 1 12 15
 
   // insert more items
   insert(16);
 
   // front : 1
   // rear  : -1
   // ----------------------
   // index : 0  1 2 3 4  5
   // ----------------------
   // queue : 16 5 9 1 12 15
   // As queue is full, elements will not be inserted.
   insert(17);
   insert(18); 
   // ----------------------
   // index : 0  1 2 3 4  5
   // ----------------------
   // queue : 16 5 9 1 12 15
   printf("Element at front: %d\n",peek()); 
   printf("----------------------\n");
   printf("index : 5 4 3 2  1  0\n");
   printf("----------------------\n");
   printf("Queue:  ");     
   while(!isEmpty()) {
      int n = removeData();          
      printf("%d ",n);
   }  
}

 Output

Queue is full!
Element removed: 3
Element at front: 5
----------------------
index : 5 4 3 2 1 0
----------------------
Queue: 5 9 1 12 15 16

 

 


/*
*/