数据结构与算法(四)- 用数组模拟环形队列
对前面的数组模拟队列的优化,充分利用数组,因此将数组看作是一个环形的。(通过取模的方式来实现)
思路如下:
- front变量的含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front的初始值=0
/**
* front的变量含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]
* 初始值 = 0
*/
private int front;
- rear变量的含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个空间做为约定,rear的初始值=0
/**
* rear的变量含义做一个调整:rear指向队列的最后一个元素的后一个位置,因为希望空出一个位置做约定
* 初始值 = 0
*/
private int rear;
- 当队列满时,条件是(rear+1)%maxSize=front(满)
// 判断队列是否满
private boolean isFull(){
return (rear + 1) % maxSize == front;
}
- 队列为空时的条件,rear == front 空
// 判断队列是否为空
private boolean isEmpty(){
return rear == front;
}
- 入队
public void addCirleQueue(int num){
if (isFull()){
System.out.println("队列已满");
}else {
arr[rear] = num;
rear = ( rear + 1 ) % maxSize;// 因为是环形 所以用取模的方法
}
}
- 出队
public int getFront(){
if (isEmpty()){
System.out.println("队列已空");
return 0;
}else {
int num = arr[front];
front = (front + 1) % maxSize;
return num;
}
}
- 队列中有效的数据个数:(rear+maxSize-front)%maxSize
笔者的粗浅理解
队列与环形队列的区别:
- front和rear的定义不同:一个初始值都为0,一个初始值都为-1,笔者也思考过是不是起始点都为0可能会比较适合理解,但是却忽略了一点,就是普通队列的操作是先向往后一步,再进行操作,这点是与环形不同的。环形是在进行操作再往后一步,如果都设0为起始,那普通队列的[0]就永远无法被赋值
- 在环形队列中,要好好理解arr[front]就是队列的第一个元素,rear指向队列的最后一个元素的后一个位置
- 环形队列的精髓在于取模