Queue pada Java
Queue (antrian) adalah struktur data dimana
data yang pertama kali dimasukkan adalah data yang pertama kali bisa dihapus.
Atau bisa juga disebut dengan struktur data yang menggunakan
mekanisme FIFO (First In First Out).
Queue dalam kehidupan sehari-hari seperti antrian
pada penjualan tiket kereta api, dimana orang yang pertama datang adalah orang
yang pertama kali dilayani untuk membeli tiket. Jika ada orang baru yang datang
akan membali tiket, maka posisinya berada pada urutan paling belakang dalam
antrian tersebut. Orang yang berada pada posisi terakhir dalam antrian
adalah yang terakhir kali dapat dilayani dan memperoleh tiket kereta api (kalau
kurang beruntung, maka akan kehabisan tiket). Contoh lain adalah nasabah yang
antri di teller bank, paket data yang menunggu untuk ditransmisikan lewat
internet, antrian printer dimana terdapat antrian print job yang menunggu
giliran untuk menggunakan printer, dsb.
Fungsi dalam Queue:
Fungsi init : digunakan untuk membuat queue baru
atau kosong, yaitu dengan memberi nilai awal (head) dan nilai akhir (tail)
dengan -1.
Fungsi full: digunakan untuk mengetahui apakah queue
sudah penuh atau belum. Dilakukan dengan memeriksa nilai akhir (tail) apakah
sudah sama dengan maksimal queue.
Fungsi empty: digunakan untuk mengetahui apakah
queue masih kosong atau tidak. Dilakukan dengan memeriksa nilai akhir (tail)
bernilai -1 atau tidak.
Fungsi enqueue : digunakan untuk menambahkan elemen
ke dalam queue.
Fungsi dequeue : digunakan untuk mengambil elemen
dari queue, dengan cara memindahkan semua elemen satu langkah ke posisi
depannya sehingga elemen yang paling depan tertimpa.
Fungsi clear : digunakan untuk menghapus semua
elemen dalam queue. Ada dua cara yang bisa digunakan, yaitu menuliskan fungsi
seperti inisialisasi atau memanggil fungsi remove sampai queue kosong.
Istilah-istilah yang digunakan dalam queue (antrian)
Memasukkan data (insert) disebut juga dengan put, add, atau enqueue.
Memasukkan data (insert) disebut juga dengan put, add, atau enqueue.
Menghapus data (remove) biasa disebut dengan
istilah delete, get, atau dequeue.
Bagian belakang queue, dimana data bisa
dimasukkan disebut dengan back, tail (ekor),
atau end (akhir).
Sedangkan bagian depan
(front) queue dimana data bisa dihapus juga biasa disebut dengan
istilah kepala(head).
Circular Queue
Di dunia nyata apabila seseorang sedang mengantri (misalnya antri tiket kereta api), apabila telah dilayani dan memperoleh tiket, maka ia akan keluar dari antrian dan orang-orang yang berada di belakangnya akan bergerak maju ke dapan. Kita bisa saja menggerakkan setiap item data ke depan apabila kita menghapus data yang terdepan, tetapi hal ini kurang efektif. Sebaliknya kita tetap menjaga setiap item data di posisinya, yang kita lakukan hanyalah merubah posisi front dan rear saja.
Di dunia nyata apabila seseorang sedang mengantri (misalnya antri tiket kereta api), apabila telah dilayani dan memperoleh tiket, maka ia akan keluar dari antrian dan orang-orang yang berada di belakangnya akan bergerak maju ke dapan. Kita bisa saja menggerakkan setiap item data ke depan apabila kita menghapus data yang terdepan, tetapi hal ini kurang efektif. Sebaliknya kita tetap menjaga setiap item data di posisinya, yang kita lakukan hanyalah merubah posisi front dan rear saja.
Yang menjadi permasalahan adalah apabila posisi rear berada pada bagian akhir dari array (atau pada nomor indeks yang terbesar). Meskipun ada bagian yang kosong di awal-awal array – karena mungkin data telah dihapus, data baru tidak bisa dimasukkan lagi karena rear-nya sudah tidak bisa bergerak lagi. Atau mungkinkah posisi rear nya bisa berpindah? Situasi seperti itu bisa dilihat seperti gambar berikut:
Untuk menghindari permasalahan seperti itu (tidak
bisa memasukkan data baru) – meskipun queue-nya belum penuh,
maka front dan rear-nya berputar (kembali) ke bagian awal array.
Kejadian seperti ini dinamakan dengan circular queue (atau
kadang-kadang disebut juga dengan istilah ring buffer). Kejadian seperti
ini seperti terlihat pada gambar berikut:
Perhatikan bahwa setelah rear berputar
(kembali) ke bagian awal array, posisinya sekarang di bawah front,
kebalikan dari posisi aslinya (front berada di bawah rear). Coba
hapus beberapa data sehingga pada suatu saat front juga akan berputar
(balik) ke bagian awal array, sehingga front dan rear akan
ke susunan aslinya (front di bawah rear).
method insert()
Method insert() mengasumsikan bahwa queue tidak penuh (full). Kita tidak melihatnya dalam main(), tetapi kita bisa memanggil insert() hanya setelah memanggil isFull() dan memperoleh nilai kembalian yang salah. Pengisian data dengan cara menaikkan rear dan mengisikan data baru tersebut pada rear yang baru sekarang. Tetapi, jika rear berada di puncak array, pada maxSize-1, maka harus kembali ke posisi terbawah array sebelum penyisipan dilakukan. Caranya dengan memberi nilai rear=-1, sehingga jika terjadi kenaikan pada pada rear, maka rear akan menjadi 0, dasar dari array. Dan akhirnya, nItem bertambah.
Method insert() mengasumsikan bahwa queue tidak penuh (full). Kita tidak melihatnya dalam main(), tetapi kita bisa memanggil insert() hanya setelah memanggil isFull() dan memperoleh nilai kembalian yang salah. Pengisian data dengan cara menaikkan rear dan mengisikan data baru tersebut pada rear yang baru sekarang. Tetapi, jika rear berada di puncak array, pada maxSize-1, maka harus kembali ke posisi terbawah array sebelum penyisipan dilakukan. Caranya dengan memberi nilai rear=-1, sehingga jika terjadi kenaikan pada pada rear, maka rear akan menjadi 0, dasar dari array. Dan akhirnya, nItem bertambah.
Method remove()
method remove mengasumsikan queue-nya tidak kosong. Untuk meyakinkan bahwa queue-nya tidak kosong, anda harus memanggil method isEmpty(). Penghapusan selalu dimulai dengan memperoleh nilai pada front dan kemudian mengurangi front. Jika front-nya terletak pada akhir array, maka harus kembali ke 0. KemudiannItems dikurangi.
method remove mengasumsikan queue-nya tidak kosong. Untuk meyakinkan bahwa queue-nya tidak kosong, anda harus memanggil method isEmpty(). Penghapusan selalu dimulai dengan memperoleh nilai pada front dan kemudian mengurangi front. Jika front-nya terletak pada akhir array, maka harus kembali ke 0. KemudiannItems dikurangi.
Method peek()
untuk mendapatkan nilai pada front.
untuk mendapatkan nilai pada front.
Method isEmpty(), isFull(), and size()
untuk mengecek nItems, apakah kosong atau penuh.
untuk mengecek nItems, apakah kosong atau penuh.
2.
OPERASI-OPERASI
Adapunoperasipadaantriandiantaranyaadalah
:
a.
Create à membuatantrianbaruataumenginisialisasi/mendefinisikanantrian
yang
kosong.
b.
IsEmptyà mengecekapakahantriandalamkedaankosongatautidak.
c.
IsFullà mengecekapakahantriansudahpenuhataubelum.
d.
Enqueueà menambahelemenbarupadaantrian yang berisi
info baru (IB) padaposisi
palingbelakang ( REAR ).
ü Syaratawal
: Queue tidakpenuh ( jikapenuhakanterjadi overflow ).
ü Syaratakhir
: Queue bertambahsatuelemen.
e.
Dequeueà menghapuselemendariantrian yang
beradapadaposisi paling depan
( FRONT)
daninfonyadisimpandalam info dequeue (ID )
ü Syaratawal
: Queue tidakkosong (jikakosongakanterjadi underflow).
ü Syaratakhir
: Queue berkurangsatuelemen.
f.
Clear à menghapuselemen-elemenAntrian.
g.
Tampilà menampilkannilai-nilaielemenAntrian.
Tidak ada komentar:
Posting Komentar