使用陣列模擬佇列
初始化佇列
private int front;
指向佇列頭的第一個元素
privat int maxSzie;
設定佇列的最大長度
private int rear;
指向佇列尾的最後一個元素的後一個位置,留出一個位置作為約定
因為需要留出一個位置作為約定,那麼當陣列的maxSize == 4;
的時候有效資料的個數就等於3個
private int[] arr;
使用陣列來儲存資料,模擬環形佇列
那麼佇列就會形成一個圓環形狀的 如下圖:
通過分析可以得出front == rear
的時候環形佇列是空的
當對列滿的時候就是 (rear + 1) % maxSize == front;
佇列的有效資料個數(rear + maxSize - front) % maxSize;
佇列的有效資料個數就可以用來遍歷出整個環形佇列的有效值
遍歷從front
頭指標開始
程式碼實現:
通過開始判斷出來的思路,寫程式碼實現
佇列的判空和判滿
/**
* 用來判斷環形佇列是否滿的狀態
*
* @return
*/
public boolean isFull() {
return (rear + 1) % maxSize == front;
}
/**
* 判斷佇列是否為空
*
* @return
*/
public boolean isEmpty() {
return rear == front;
}
向環形佇列中新增一個元素和取出元素
/**
* 向佇列新增一個元素
*
* @param number
*/
public void addQueue(int number) {
if (isFull()) {
System.out.println("佇列滿,無法加入資料·····");
return;
}
arr[rear] = number;
//將rear後移,向後移動指標的時候必須要考慮取模,不然就會造成陣列越界
rear = (rear + 1) % maxSize;
}
/**
* 從佇列中取出一個元素
*
* @return
*/
public int getQueue() {
if (isEmpty()) {
new RuntimeException("當前佇列為空,不能取出資料");
}
/**
* front 指向佇列的第一個元素
* 1、先吧front儲存在一個臨時變數
* 2、將front後移,後移指標的時候一樣必須考慮取模,否則也會造成陣列越界
* 3、將臨時儲存的變數返回
*/
int val = arr[front];
front = (front + 1) % maxSize;
return val;
}
顯示佇列的所有元素--難點
最重要的是需要計算出來陣列中有多少個有效數值
通過思路分析已經得初有效數值的個數(rear + maxSize - front) % maxSize;
這就是陣列的有效資料個數
並且陣列的第一個元素是從front
開始,那麼就需要從front
開始遍歷
for(int i = front ; i < front + ((rear + maxSize - front) % maxSize); i++){
//在遍歷的時候必須要考慮取模,不然就會陣列越界
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
具體的程式碼實現為:
/**
* 顯示佇列所有元素
*
* @return
*/
public void showQueue() {
if (isEmpty()) {
//當前佇列為空,不能取出資料
System.out.println("佇列為空,沒有資料·····");
return;
}
//思路:從front開始遍歷,遍歷多少個元素呢
for (int i = front; i < front + size(); i++) {
System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);
}
}
/**
* 求出當前佇列的有效資料的個數
*
* @return
*/
public int size() {
return (rear + maxSize - front) % maxSize;
}
輸出佇列的第一個元素
因為 front
指向的就是佇列頭的第一個元素,那麼arr[front]
就是第一個元素
/**
* 取出佇列頭元素
*
* @return
*/
public int headQueue() {
if (isEmpty()) {
new RuntimeException("佇列為空,不能取出資料·····");
}
return arr[front];
}
整篇原始碼檢視
gitee:環形佇列
github:環形佇列