1. 程式人生 > 其它 >迴圈佇列解決空陣列不能新增資料的問題

迴圈佇列解決空陣列不能新增資料的問題

public class CircleArrayQueueDemo {

	public static void main(String[] args) {
		System.out.println("測試模擬環形佇列的案例~");
		//有效個數3個,因為有一個空位
		CircleArrayQueue queue = new CircleArrayQueue(4);
		char key = ' ';
		Scanner scanner = new Scanner(System.in);
		boolean loop = true;
		while(loop){
			System.out.println("s:顯示佇列");
			System.out.println("e:退出程式");
			System.out.println("a:新增資料到佇列");
			System.out.println("g:從佇列取出資料");
			System.out.println("h:檢視佇列頭的資料");
			key = scanner.next().charAt(0);
			switch (key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("請輸入一個數:");
				int num = scanner.nextInt();
				queue.addQueue(num);
				break;
			case 'g':
				try {
					int result = queue.getQueue();
					System.out.printf("取出的資料是%d\n",result);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h':
				try {
					int result = queue.headQueue();
					System.out.printf("佇列頭的資料是%d\n",result);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'e':
				scanner.close();
				loop = false;
				break;
			default:
				break;
			}
		}
		System.out.println("程式退出");
	}
}
class CircleArrayQueue{
	//佇列的最大容量
	private int maxSize;
	//front變數的含義做一個調整:front就指向佇列的第一個元素,
	//也就是說arr[front]是佇列的第一個元素
	//front的初始值是0
	private int front;
	//rear變數的含義做一個調整:rear就指向佇列的最後一個元素的後一個位置,
	//因為希望空出一個位置做為約定
	//rear的初始值是0
	private int rear;
	//該陣列用於存放資料,模擬佇列
	private int[] arr;
	//初始化佇列資料
	public CircleArrayQueue(int maxSize){
		this.maxSize = maxSize;
		this.arr = new int[maxSize];
		this.front = 0;
		this.rear = 0;
	}
	//判斷佇列是否滿
	public boolean isFull(){
		return (this.rear + 1) % this.maxSize == this.front;
	}
	//判斷佇列是否為空
	public boolean isEmpty(){
		return this.rear == this.front;
	}
	//新增資料到佇列
	public void addQueue(int num){
		if(isFull()){
			System.out.println("佇列已滿,請稍後再新增。");
			return;
		}
		this.arr[this.rear] = num;
		//rear後移,這裡必須考慮取模,因為比如說已經到最後一個位置,
		//直接+1複製的話,那麼就越界了,所以需要對maxSize取模
		this.rear = (this.rear + 1) % this.maxSize;
	}
	//獲取佇列資料,出佇列
	public int getQueue(){
		if(isEmpty()){
			throw new RuntimeException("佇列為空,不能取資料。");
//			System.out.println("佇列為空。");
//			return -1;
		}
		//這裡需要分析出:front是指向佇列的第一個元素
		//1、先把front對應的值保留到一個臨時變數;
		//2、將front後移;
		//3、將臨時儲存的變數返回
		int value = this.arr[this.front];
		this.front = (this.front + 1) % this.maxSize;
		return value;
	}
	//顯示佇列的所有資料
	public void showQueue(){
		if(isEmpty()){
			System.out.println("佇列為空。");
			return;
		}
		for (int i = this.front; i < this.front + size(); i++) {
			System.out.printf("arr[%d]=%d\n", i % this.maxSize,arr[i % this.maxSize]);
		}
	}
	
	//求出當前佇列的有效資料個數
	public int size(){
		//rear = 2
		//front = 1
		//maxSize = 3
		return (this.rear + this.maxSize - this.front) % this.maxSize;
	}
	
	//顯示佇列的頭資料,不是取資料
	public int headQueue(){
		if(isEmpty()){
			throw new RuntimeException("佇列為空。");
		}
		return this.arr[this.front];
	}
}