CIRCULAR QUEUE
Misal diberikan queue Q dengan jumlah elemen sebanyak 100,
yang digambarkan sebagai berikut
1
|
2
|
3
|
4
|
5
|
...
|
99
|
100
|
Kemudian dilakukan operasi remove 2 kali berurutan, sehingga
bentuknya menjadi
|
|
C
|
D
|
|
|
|
|
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
...
|
99
|
100
|
Selanjutnya dilakukan operasi insert untuk 3 elemen secara
berurutan yaitu E, F dan G maka bentuknya menjadi
|
|
C
|
D
|
E
|
F
|
G
|
|
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
...
|
99
|
100
|
Kemudian dilakukan operasi remove lagi berurutan…
|
|
|
|
|
|
|
|
|
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
...
|
99
|
100
|
Terlihat bahwa elemen – elemen queue bergerak terus dari kiri
ke kanan sepanjang arraynya
Apa yang terjadi bila suatu saat rear = 100 dan kita masih
akan memasukkan suatu elemen ke dalam queue? Dalam keadaan ini, batas maksimum
telah dicapai, padahal kita masih ingin menambah / memasukkan beberapa elemen
lagi
Salah satu cara / pendekatan untuk menyelesaikan masalah
seperti ini adalah dengan menambah ukuran array yang digunakan
Artinya, kita harus mendeklarasikan array dengan ukuran yang
besar untuk menempatkan queue tersebut
Tetapi cara ini dianggap tidak efektif, karena keadaan serupa
masih dapat muncul kembali
Cara lain yang dianggap lebih baik adalah dengan mengubah
queue tersebut kedalam bentuk yang disebut circular
Dalam hal ini kondisi dari suatu queue kosong adalah FRONT =
REAR = 0
Selanjutnya jika elemen queue melampaui batas yang ada
sedangkan kita masih memiliki ruang yang kurang
Maka posisi front dan rear harus direset dulu agar kita bias
memasukkan elemen ke dalam queue tersebut
PROCEDURE REMOVE
Procedure remove (eoff : int);
Begin
If (e.front = 0) then underflow_condition
Else begin
Eoff := q.queue[q.front];
If (q.front = q.rear) then
Begin
q.front := 0;
q.rear := 0;
end
else if (q.front = n)
then q.front := 1
else q.front := q.front + 1
end;
end;
Tidak ada komentar:
Posting Komentar