Ala satu variasi array adalah array yang bentuknya melingkar (circual array). Artinya array dapat diakses mulai dari sembarang indeks(indeks awal) karah indeks terakhir(maksimum indeks), lalu memutar ke indeks pertama hingga kembali ke indeks awal. Circular array adalah array yang dibuat seakan-akan merupakan sebuah lingkaran dengan titik awal dan titik akhir saling bersebelahan jika array tersebut masih kosong. Jumlah data yang dapat ditampung oleh array ini adalah besarnya ukuran array dikurangi 1. Misalnya besar array adalah 8, maka jumlah data yang dapat ditampung adalah 7.
Dengan circular array, meskipun posisi terakhir telah dipakai, elemen baru tetap dapat ditambahkan pada posisi pertama jika posisi pertama dalam keadaan kosong. Jika akhir = MAX dan awal = 1, nilai head dan Tagil mencapai maksimum, maka akan dikembalikan ke posisi awal. Operasi-operasi yang terdapat pada circular array tidak jauh berbeda dengan operasi pada linear array.
Aturan-aturan dalam queue yang menggunakan circular array adalah :
1. Proses penghapusan dilakukan dengan cara nilai depan(front) ditambah 1 : depan += 1
2. Proses penambahan elemen sama dengan linear array yaitu nilai belakang ditambah 1 : belakang += 1
3. Jika depan = maks dan ada elemen yang akan dihapus, maka nilai depan = 1
4. Jika belakang = maks dan depan tidak 1, maka jika ada elemen yang akan ditambahkan, nilai belakang = 1
5. Jika hanya tinggal 1 elemen di queue (depan = belakang), dan akan dihapus maka depan diisi 0 dan belakang diisi dengan 0 (queue kosong)
Contoh :
3.4.1 Pendeklarasian Queue
Setiapqueue memiliki elemen-elemen(field) berupa posisi depan, posisi belakang, elemen antrian, dan elemen maksimal.
3.4.2 Inisialisasi Queue
Inisialisasi queue adalah proses pemberian nilai 0 untuk field depan dan belakang dari queue dan juga pemberian nilai maks ke maks_queue yang menunjukan banyaknya maksimal data dalam queue. Karena dalam bahasa C++ elemen sebuah array dimulai dengan 0 maka proses inisialisasi nilai depan dan belakang bukan 0 tetapi -1 sehingga ketika ada proses penambahan elemen (enqueue) akan bernilai 0 sehingga elemen tersebut
akan disimpan dalam elemen antrian pada posisi 0. 3.4.3 Fungsi IsEmpty
Suatu queue yang menggunakan circular array dapat dikatakan kosong jika nilai yang menunjuk posisi depan atau belakang mempunyai nilai 0.
Implementasi dalam bahasa C++, perbandingan posisi depan atau belakang dilakukan bukan dengan angka 0 tetapi angka -1 karena angka 0 menunjukan elemen pertama dari array.
3.4.4 Fungsi IsFull
Suatu queue akan disebut penuh jika terjadi 2 hal yaitu jika nilai depan mempunyai nilai 1 dan posisi belakang sama dengan maks_queue atau jika posisi depan sama dengan posisi belakang +1. Jika salah satu dari 2 hal tersebut terjadi maka fungsi penuh mempunyai nilai true dan jika tidak terjadi 2 hal tersebut maka fungsi bernilai false. Implementasi dalam bahasa C++ agar beda karena posisi awal array bukan 1 tapi 0 dan posisi terakhir data adalah maks_queue-1 bukan maks_queue.
3.4.5 Fungsi EnQueue
Proses enqueue data hanya bisa dilakukan jika queue tidak kosong. Ada beberapa hal yang harus diperhatikan ketika akan melakukan enqueue pada
circular array, diantaranya adalah :
1. Kondisi ketika queue masih kosong. Jika ini terjadi, maka posisi depan dan belakang bernilai 0.
2. Ketika ketika nilai belakang sama dengan maks_queue, maka posisi belakang adalah 0. Ini terjadi ketika posisi depan lebih besar dari 0
(pernah ada dequeue).
3. Ketika nilai belakang masih lebih kecil dari maks_queue maka posisi belakang ditambah 1 : belakang+=1;
Dari ketentuan-ketentuan di atas dapat diimplementasikan dalam bahasa C++ dengan mengganti beberapa hal yaitu posisi perbandingan / pengisian dengan nilai 0 diganti dengan perbandingan / pengisian dengan nilai -1 dan perbandingan dengan nilai maks_queue diganti dengan maks_queue-1 Itu disebabkan karena dalam bahasa C++ array dimulai dari 0.
3.4.6 Fungsi DeQueue
Proses dequeue hanya bisa dilakukan jika queue dalam keadaan tidak kosong. Ada beberapa kondisi yang harus diperhatikan ketika dequeue elemen queue yaitu :
Kondisi ketika posisi depan sama dengan posisi belakang (queue hanya memiliki 1 elemen) maka nilai depan dan belakang diisi dengan 0 (queue kosong).
Jika posisi depan sama dengan posisi maks_queue maka posisi depan berpindah ke 1.
Selain itu, posisi depan ditambah dengan 1 : depan=depan+1 Ketika kita mengimplementasikannya dalam bahasa C++, maka ada beberapa hal yang harus diganti adalah semua pengisian/perbandingan dengan angka 1 diganti dengan 0 (karena elemen array dalam bahasa C++ adalah 0), serta ketika ada perbandingan/pengisian dengan nilai 0 diganti dengan -1 dan perbandingan/pengisian dengan nilai maks_queue diganti dengan maks_queue-1.
Contoh : Program Circular Array #include <iostream> using namespace std; typedef struct{ int data[5]; int head; int tail; }Queue; Queue antri; typedef struct { int baru; }struk; struk variabel; void input(){ if(antri.tail== 5-1) { cout<<"Antrian Penuh"; } else {
cout<<"Data yang akan di Push = ";cin>>variabel.baru; antri.tail++;
antri.data[antri.tail]=variabel.baru;
cout<<"Head = "<<antri.head<<" Tail = "<<antri.tail; } } void out(){ if(antri.tail < antri.head) { cout<<"Antrian Kosong"; } else { //koreksi
cout<<"Data yang akan di keluar = "<<antri.data[antri.head]<<endl;
antri.head = antri.head+1;
cout<<"Head = "<<antri.head<<" Tail = "<<antri.tail; } } void cetak(){ if(antri.tail==-1) { cout<<"Antrian Kosong"; } else{ cout<<endl;
cout<<"Data dalam antrian adalah : "<<endl<<endl; //koreksi for(int i=antri.head;i<=antri.tail;i++){ cout<<antri.data[i]<<" "; } } } int main(){
int pil, baru, i; //koreksi
antri.tail=-1; cout<<"====================================="<<endl; cout<<"= Q u e u e ( A N T R I A N ) ="<<endl; cout<<"====================================="<<endl; do{ cout<<endl; cout<<"*************************************"<<endl; cout<<"1. Masukkan Data"<<endl;
cout<<"2. Keluarkan Data"<<endl; cout<<"3. Cetak Data"<<endl;
cout<<"Silahkan Masukan Pilihan Anda : ";cin>>pil; cout<<endl; switch (pil){ case 1: { input(); break; } case 2: { out(); break; } case 3: { cetak(); break; } default : { cout<<"---"<<endl;
cout<<" Maaf, Tidak ada dalam pilihan "<<endl; cout<<"---"<<endl; } } }
while(pil>=1 && pil<= 3); }
Tugas !
Buatlah program stack dengan syarat :
a) User memasukkan data berupa NIM dan Nama. b) User dapat mengeluarkan data.
c) Kosongkan data. d) Cetak data
BAB III
SORTING
3.1 Pendahuluan
Pengurutan data dalam struktur data sangat penting terutama untuk data yang bertipe data numerik ataupun karakter
Pengurutan dapat dilakukan secara ascending (urut naik) maupun descending (urut turun)
Pengurutan (sorting) adalah proses pengurutan data yang sebelumnya disusun secara acak sehingga secara teratur menurut aturan tertentu. Contoh :
Data Acak : 9 1 0 5 78 31 55 10 Ascending : 0 1 5 9 10 31 55 78 Descending : 78 55 31 10 9 5 1 0