首先我們來看一個隊列在實際生活中的場景
我們在銀行辦理業務,是不是會看到這樣一種場景,有一隊人正整齊的排着隊,在窗口前,等待辦理業務,其實這就是隊列在實際應用中的一個體現。
隊列的特點
- 隊列的是Java數據結構中的一種,它的一個有序的 列表 ,可以使用數組或者鏈表來實現。
- 遵循先進先出的原則,先存入的數據會先被取出來,後存入的數據會後取出來
隊列的形式
- 單向隊列
- 環形隊列
數組模擬單向隊列
- 圖解隊列
- maxsize :該隊列中最大能存儲的元素個數
- front :隊列的頭部,它隨着隊列元素的輸出而改變,初始值賦值爲-1
- rear: 隊列的尾部,它隨着隊列的增加而改變,初始值賦值爲-1
- array[maxSize] : 存放數據的數組
- 向隊列中存入數據,首先判斷該隊列是否已經存滿,再存入隊列中
- 向隊列取出數據,首先判斷該隊列是否爲空,在向隊列取出元素
- 判斷隊列已滿:
rear == maxSize-1
; - 判斷隊列爲空:
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] : 存放數據的數組
- 向隊列中存入數據,首先判斷該隊列是否已經存滿,再存入隊列中
- 向隊列取出數據,首先判斷該隊列是否爲空,在向隊列取出元素
- 判斷隊列已滿:
(rear+1)%maxSize == front
; - 判斷隊列爲空:
rear == front
- 計算隊列中有效數據
(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]);
}
}
}
以上就是兩種形式的用數組實現的隊列。能力有限僅供參考!!!