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;
0 komentar:
Posting Komentar