使用數組模擬隊列
初始化隊列
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:環形隊列