队列的详解
## 队列
### 一、队列定义
1.队列是先进先出的数据结构,是一种只能在一端插入一端删除的线性表
二、基本实现
1. 一次性队列
如上图:队列Queue的最大长度为MaxSize,有两个指针font、rear;
font: 指向队头的前一个位置;初始值为-1;
rear: 指向队尾元素,初始值为-1;
判断队列满: rear == MaxSize-1时队列满;
判断队列为空: rear == font
虽然上述可以实现队列,但是当元素入队,使队列满之后,然后出队font后移,当队列中元素全部出队rear == font, 然后你再入队,永远是队列已满,队列前面空出来的位置无法使用所以此为一次性队列;
1. 循环队列
循环队列是为了解决队列可循使用,如图:
解析:队列Queue,最大长度为MaxSize = 8;
font: 指向队头元素,初始值为0;
rear: 指向队尾元素,初始值为0;
注意循环队列中存储的元素最大值为(MaxSize-1) ,因为在当队列为null时,font == rear,队列满时也有font==rear,为了区别这两种情况,规定循环队列中最多只能又(MaxSize-1)个元素,当队列中只剩一个空的存储单位时,队列就已经满了所以;
队列满: (rear+1)%MaxSize == font
队列空: rear == font;
判断队列中的有效元素个数: (rear+MaxSize-font)%MaxSize
下面为循环队列的基本操作
```java
public class LoopQueue {
public static void main(String[] args) {
LoopQueueArr loopQueueArr = new LoopQueueArr(5);
System.out.println(loopQueueArr.isNull());
loopQueueArr.addQueue(1);
loopQueueArr.addQueue(2);
loopQueueArr.addQueue(3);
loopQueueArr.addQueue(4);
System.out.println(loopQueueArr.getHead());
System.out.println(loopQueueArr.getQueue());
System.out.println(loopQueueArr.getQueue());
System.out.println(loopQueueArr.getHead());
System.out.println(loopQueueArr.getNumber());
loopQueueArr.addQueue(5);
loopQueueArr.addQueue(6);
System.out.println(loopQueueArr.getNumber());
}
}
// 创建循环队列
class LoopQueueArr {
private int font; //指向队列的头元素
private int rear; // 指向尾元素的后一个位置,即下次入队新元素的位置
private int maxSize; // 队列的最大长度
private int[] loopArray;
// 初始化队列
public LoopQueueArr(int maxSize) {
font = 0;
rear = 0;
this.maxSize = maxSize;
loopArray = new int[maxSize];
}
// 判断队列是否满
public boolean isFull() {
return (rear + 1) % maxSize == font;
}
// 判断队列是否为Null
public boolean isNull() {
return rear == font;
}
// 获得队列中的有效个数
public int getNumber() {
return (rear+maxSize-font)%maxSize;
}
// 入队
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
loopArray[rear] = n; // 将新元素插入到队尾
rear = (rear+1)%maxSize; //rear后移一位
}
// 出队
public int getQueue() {
if (isNull()) {
throw new RuntimeException("队列为null");
}
int temp = loopArray[font]; //队头元素暂存到temp中
font = (font+1)%maxSize; //队头后移
return temp;
}
// 遍历队列
public void getList() {
if (!isNull()) {
for (int i=0;i<loopArray.length;i++) {
System.out.print(loopArray[i] + "");
}
}
}
// 获得队头元素
public int getHead() {
if (isNull()) {
throw new RuntimeException("为空");
}
return loopArray[font];
}
}
```