伊莉討論區
標題:
環形Queue問題
[打印本頁]
作者:
cynthialar
時間:
2011-10-18 11:13 PM
標題:
環形Queue問題
本帖最後由 cynthialar 於 2011-10-18 11:21 PM 編輯
請問一下,要如何解決環形Queue的一個空白位置處理?也就是說如果我的陣列大小是5個,但是因為環形Queue的關係,所以會有一格是沒存進去的,且會顯示滿的,我的code如下:
class homeworkqueue{
public static void main(String[] args){
queue testnumber = new queue();
testnumber.enqueue(30);
testnumber.enqueue(50);
testnumber.enqueue(40);
testnumber.enqueue(10);
testnumber.enqueue(20);
//testnumber.enqueue(100);
for(int i = 0; i < 5; i++)
System.out.println(testnumber.dequeue());
}
}
class queue{
public int[] number = new int[5];
public int f = 0; //head
public int r = 0; //tail
public void enqueue(int num){
if(is_full() == true){
System.out.println("It's full!!");
}
else{
number[f] = num;
f = (f + 1) % 5;
}
}
public boolean is_full(){
if((f + 1) % 5 == r)
return true;
else
return false;
}
public int dequeue(){
if(is_empty() == true){
System.out.print("It's empty!! ");
return -1;
}
else{
int tmp = number[r];
r = (r + 1) % 5;
return tmp;
}
}
public boolean is_empty(){
if(r == f)
return true;
else
return false;
}
}
複製代碼
我想過很多方法了,但是就是一直寫不出來,請問各位要如何去寫呢? 謝謝
作者:
kwj
時間:
2011-10-19 12:32 AM
本帖最後由 kwj 於 2011-10-19 12:36 AM 編輯
front 指的是空的格子,也就是下一個要填入的值要放的位置
但是 rare 指的是已填資料的格子,兩個變數的定義不太一樣
所以這種狀況下 front 前進時應該是要剛好跟 rare 指到同一格時才會是 full
(因為 front+1 = rare 的話,front 此時會指的格子是空的格子,因此會出現有一格一直填不到)
不過 full 跟 empty 條件都是 front == rare 的話會有點問題...
所以可以再加上一個 flag 標註現在是 full 狀態的 front == rare,還是 empty 狀態的 front == rare
參考的程式碼如下:
public class queue {
private int[] number = new int[5];
private int f = 0;
private int r = 0;
private int flag = 0; // default is empty
public boolean enqueue(int num) {
boolean success = false;
if (is_full())
System.out.println("It's full!!");
else {
number[f] = num;
System.out.println("enqueue: " + num + " at index " + f);
f = (f + 1) % 5;
success = true;
if(r == f) flag = 1;
}
return success;
}
public boolean is_full() {
if (flag == 1 && r == f) return true;
else return false;
}
public int dequeue() {
int tmp = -1;
if (is_empty())
System.out.print("It's empty!!");
else {
tmp = number[r];
r = (r + 1) % 5;
if(r == f) flag = 0;
}
return tmp;
}
public boolean is_empty() {
if (flag == 0 && r == f) return true;
else return false;
}
}
複製代碼
作者:
cynthialar
時間:
2011-10-19 01:33 AM
恩恩,謝謝大哥的教導~
我再想一想您的程式邏輯~
想在問您一下,您是怎麼想到的呢??~
如何想到有這種方法??~
我想了很久都想不到,想了很多方法,轉換成程式,執行出來的東西都不如預期~
請問大哥您是如何去思考的呢??~
謝謝您~
作者:
kwj
時間:
2011-10-19 07:51 AM
本帖最後由 kwj 於 2011-10-19 07:54 AM 編輯
回復
3#
cynthialar
自己模擬一次 cyclic queue 依序填值進去的狀況
就會發現 front+1 == rare 的話,front 指到的最後一格會填不到東西
(邏輯上其實 front +1 == rare 應該是在插入完以後才檢查
他檢查的是下一次有沒有空間插入,而不是現在有沒有空間插入
因為 front 指的是空的格子~而不是滿的格子)
所以應該要檢查 front == rare 才對
但如果 full 跟 empty 條件相同的話,當條件觸發時我根本沒辦法判斷現在到底是 full 還是 empty....
如果不判斷的話,初始的 empty 狀況會被誤判成 full,cyclic queue 根本沒辦法開始運作
所以就想辦法知道要怎麼判斷囉!
那首先會先注意到的是:
1. 只有在 enqueue 時需要判斷 full 的狀況
2. 只有在 dequeue 時需要判斷 empty 的狀況
那麼最簡單的處理方法就是 enqueue 時插入資料完以後檢查一下現在條件滿足了沒
滿足了這時就會是 full,因為 enqueue 不可能造成 empty~
就加個 flag 記錄一下現在 full 觸發了
而 dequeue 則是丟資料出來時檢查條件滿足了沒
沒有滿足的話就會是 empty,把 flag 記錄成 empty 觸發~
歡迎光臨 伊莉討論區 (http://godaddy01.mobile.wahas.com/)
Powered by Discuz!