1. 程式人生 > 其它 >3.陣列模擬環形佇列

3.陣列模擬環形佇列

1.定義變數

private int maxSize; // 表示陣列的最大容量
	//front 變數的含義做一個調整: front 就指向佇列的第一個元素, 也就是說 arr[front] 就是佇列的第一個元素 
	//front 的初始值 = 0
	private int front; 
	//rear 變數的含義做一個調整:rear 指向佇列的最後一個元素的後一個位置. 因為希望空出一個空間做為約定.
	//rear 的初始值 = 0
	private int rear; // 佇列尾
	private int[] arr; // 該資料用於存放資料, 模擬佇列
	
	public CircleArray(int arrMaxSize) {
		maxSize = arrMaxSize;
		arr = new int[maxSize];
	}
	

2.判斷佇列是否滿

public boolean isFull() {
		return (rear  + 1) % maxSize == front;
	}

3.判斷佇列是否為空

public boolean isEmpty() {
		return rear == front;
	}
	

4.新增資料到佇列

public void addQueue(int n) {
		// 判斷佇列是否滿
		if (isFull()) {
			System.out.println("佇列滿,不能加入資料~");
			return;
		}
		//直接將資料加入
		arr[rear] = n;
		//將 rear 後移, 這裡必須考慮取模
		rear = (rear + 1) % maxSize;
	}

5.獲取佇列的資料, 出佇列

public int getQueue() {
		// 判斷佇列是否空
		if (isEmpty()) {
			// 通過丟擲異常
			throw new RuntimeException("佇列空,不能取資料");
		}
		// 這裡需要分析出 front是指向佇列的第一個元素
		// 1. 先把 front 對應的值保留到一個臨時變數
		// 2. 將 front 後移, 考慮取模
		// 3. 將臨時儲存的變數返回
		int value = arr[front];
		front = (front + 1) % maxSize;
		return value;

	}

6.顯示佇列的所有資料

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]);
		}
	}

7.求出當前佇列有效資料的個數

public int size() {
		// rear = 2
		// front = 1
		// maxSize = 3 
		return (rear + maxSize - front) % maxSize;   
	}

8.顯示佇列的頭資料, 注意不是取出資料

public int headQueue() {
		// 判斷
		if (isEmpty()) {
			throw new RuntimeException("佇列空的,沒有資料~~");
		}
		return arr[front];
	}