Java數據結構---隊列

首先我們來看一個隊列在實際生活中的場景
我們在銀行辦理業務,是不是會看到這樣一種場景,有一隊人正整齊的排着隊,在窗口前,等待辦理業務,其實這就是隊列在實際應用中的一個體現。

隊列的特點

  • 隊列的是Java數據結構中的一種,它的一個有序的 列表 ,可以使用數組或者鏈表來實現。
  • 遵循先進先出的原則,先存入的數據會先被取出來,後存入的數據會後取出來

隊列的形式

  • 單向隊列
  • 環形隊列

數組模擬單向隊列

  • 圖解隊列
    數組模擬隊列圖解
  • maxsize :該隊列中最大能存儲的元素個數
  • front :隊列的頭部,它隨着隊列元素的輸出而改變,初始值賦值爲-1
  • rear: 隊列的尾部,它隨着隊列的增加而改變,初始值賦值爲-1
  • array[maxSize] : 存放數據的數組
  1. 向隊列中存入數據,首先判斷該隊列是否已經存滿,再存入隊列中
  2. 向隊列取出數據,首先判斷該隊列是否爲空,在向隊列取出元素
  3. 判斷隊列已滿:rear == maxSize-1
  4. 判斷隊列爲空:rear == front

代碼實現

public class ArrayQueue {
	/*用於存儲數據的數組*/
	private int[] array;

	/*隊列頭部*/
	private int front;

	/*隊列的尾部*/
	private int rear;

	/*隊列中最大存儲個數*/
	private int maxSize;

	public ArrayQueue(maxSize) {
		this.array = new int[maxSize];
		this.maxSize = maxSize;
		this.front = -1;
		this.rear = -1;
	}
	
	/**
	* 判斷該隊列是否已滿
	* @return true-已滿 | false-不滿
	*/
	private boolean isFull() {
		return 	rear == maxSize-1;
	}

	/**
	* 判斷該隊列是否爲空
	* @return true-空 | false-否
	*/
	public boolean isEmpty() {
		return rear == front;
	}

	/**
	* 向隊列中添加元素
	* @param 要添加的元素
	* @return true-成功 | false-失敗
	*/
	public boolean addQueue(int num) {
		if (isFull) {
			System.out.print("隊列已滿無法添加");
			return false;
		}
		rear++;
		array[rear] = num;
		return true;
	}

	/**
	* 獲取隊列頭部的元素
	* @return 元素值
	*/
	public int getQueue() {
		if (isEmpty()) {
			throw new RuntimeException("隊列爲空,不能取出隊列!!!");
		}
		int num = array[front];
		front--;
		return num;
	}
	
	/**
	* 顯示隊列
	*/
	public void showQueue() {
		if (isEmpty()) {
			System.out.print("隊列爲空,不能打印隊列");
			return;
		}
		for (int i = 0;i < this.array.length;i++) {
			System.out.print(array[i]);
		}
	}
}

代碼寫完了,我們這種方式存在一種問題,就是當我們取出數據後,front指針無法回到原來的位置,導致我們這個隊列只能使用一次,所以我們引出了下面一種隊列環形隊列

數組實現環形隊列

  • 圖解環形隊列
    在這裏插入圖片描述
  • maxsize :該隊列中最大能存儲的元素個數
  • front :隊列的頭部,它隨着隊列元素的輸出而改變,初始值賦值爲0
  • rear: 隊列的尾部,它隨着隊列的增加而改變,初始值賦值爲0
  • array[maxSize] : 存放數據的數組
  1. 向隊列中存入數據,首先判斷該隊列是否已經存滿,再存入隊列中
  2. 向隊列取出數據,首先判斷該隊列是否爲空,在向隊列取出元素
  3. 判斷隊列已滿:(rear+1)%maxSize == front
  4. 判斷隊列爲空:rear == front
  5. 計算隊列中有效數據(rear+maxSize-front)%maxSize

代碼實現

public class ArrayQueue {
	/*用於存儲數據的數組*/
	private int[] array;

	/*隊列頭部*/
	private int front;

	/*隊列的尾部*/
	private int rear;

	/*隊列中最大存儲個數*/
	private int maxSize;

	public ArrayQueue(maxSize) {
		this.array = new int[maxSize];
		this.maxSize = maxSize;
		this.front = 0;
		this.rear = 0;
	}
	
	/**
	* 判斷該隊列是否已滿
	* @return true-已滿 | false-不滿
	*/
	private boolean isFull() {
		return 	(rear+1)%maxSize == front;
	}

	/**
	* 判斷該隊列是否爲空
	* @return true-空 | false-否
	*/
	public boolean isEmpty() {
		return rear == front;
	}

	/**
	* 向隊列中添加元素
	* @param 要添加的元素
	* @return true-成功 | false-失敗
	*/
	public boolean addQueue(int num) {
		if (isFull) {
			System.out.print("隊列已滿無法添加");
			return false;
		}
		array[rear] = num;
		rear = (rear+1)%maxSize;
		return true;
	}

	/**
	* 獲取隊列頭部的元素
	* @return 元素值
	*/
	public int getQueue() {
		if (isEmpty()) {
			throw new RuntimeException("隊列爲空,不能取出隊列!!!");
		}
		int num = array[front];
		front = (front+1)%maxSize;
		return num;
	}
	
	/**
	* 顯示隊列
	*/
	public void showQueue() {
		if (isEmpty()) {
			System.out.print("隊列爲空,不能打印隊列");
			return;
		}
		for (int i = 0;i < (rear+maxSize-front)%maxSize;i++) {
			System.out.print(array[i]);
		}
	}
}

以上就是兩種形式的用數組實現的隊列。能力有限僅供參考!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章