1.使用普通數組時,定一個m長度的數組
0 | 1 | 2 | 3 |
把數據存入數組滿時, 再取出時, 就不能再向這個數組添加數據 , 因爲該數組最後一個位置
取模達到環形的效果, 定義兩個指針指向鏈表的第一個節點和最後一個節點(後一位)
2.環形數組
定義第一個數據也就是第一個先添加的數據的位置 first 初始值爲0
定義最後一個添加進來的數據 的後一個位置爲 last 初始值爲0 所以實際最大容量爲 max-1
3.添加數據
4.取出數據
5.查看所有數據
完整代碼
package dataStructure.環形隊列;
import java.util.Scanner;
public class CircleArrayQueue {
public static void main(String[] args) {
//測試一把
System.out.println("測試數組模擬環形隊列的案例~~~");
// 創建一個環形隊列
CircleArray queue = new CircleArray(4); //說明設置 4, 其隊列的有效數據最大是 3
char key = ' '; // 接收用戶輸入
Scanner scanner = new Scanner(System.in);//
boolean loop = true;
// 輸出一個菜單
while (loop) {
System.out.println("s(show): 顯示隊列");
System.out.println("e(exit): 退出程序");
System.out.println("a(add): 添加數據到隊列");
System.out.println("g(get): 從隊列取出數據");
System.out.println("h(head): 查看隊列頭的數據");
key = scanner.next().charAt(0);// 接收一個字符
switch (key) {
case 's':
queue.show();
break;
case 'a':
System.out.println("輸出一個數");
int value = scanner.nextInt();
queue.add(value);
break;
case 'g': // 取出數據
try {
int res = queue.getOne();
System.out.printf("取出的數據是%d\n", res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h': // 查看隊列頭的數據
try {
queue.showHead();
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e': // 退出
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~~");
}
}
class CircleArray {
private int maxSize; //定義數組的最大容量,實際最大容量爲maxSize-1 因爲 last指向最後一個數據的後一個
private int last; //定義數組最後一個數據的 後一個數據的位置 初始值爲0
private int first; //定義數組的第一個數據的位置 初始值爲0
private int arr[]; //存放數據的數組
public CircleArray(int maxSize) {
this.maxSize = maxSize;
this.arr = new int[maxSize];
}
/**
* 判斷數組是否爲空
*
* @return
*/
public Boolean isEmpty() {
return last == first;
}
/**
* 判斷數組是否滿,(last+1)%maxSize就是將指針移到開頭,因爲是環形的所以取模
*
* @return
*/
public Boolean isFull() {
return (last + 1) % maxSize == first;
}
/**
* 添加數據,添加的數據在隊未
* @param num
*/
public void add(int num) {
if (isFull()) {
System.out.println("隊列滿,不能添加~~");
return;
}
arr[last] = num; //因爲last就指向最後一個數據的後一個,所以直接是
last = (last + 1) % maxSize; //後移一位,考慮環形
}
/**
* 獲得一個數據,獲得的數據是隊首
*
* @return
*/
public int getOne() {
if (isEmpty()) {
throw new RuntimeException("隊列空,不能取~~");
}
int value = arr[first];
first = (first + 1) % maxSize; //後移一位,考慮環形
return value;
}
/**
* 查看所有數據
*/
public void show() {
int length = (last - first + maxSize) % maxSize; //先得到當前數據個數
//從第一個數開始遍歷就是first
for (int i = first; i < first + length; i++) {
System.out.printf("array[%d]=%d\n", i, arr[i]);
}
}
public void showHead() {
if (isEmpty()) {
throw new RuntimeException("隊列空,不能查看~~");
}
System.out.printf("隊列頭的數據是:%d\n", arr[first]);
}
}