数组模拟环形队列
数组队列问题:
(1)目前数组使用了一次就不能用了,没有达到复用的效果
(2)将这个数组使用算法,改进成一个环形队列
解决办法:
数组模拟环形队列,对前面的数组模拟队列优化,充分利用数组,因此将数组看做是一个环形的(通过取模实现)
使用数组模拟环形队列的思路分析:
思路如下:
1.front变量的含义做一个调整:front就指向队列的第一个元素,也就是arr[front]就是队列的第一个元素
front初始值=0
2.rear变量的:rear指向最后一元素的后一个位置,因为希望空出一个空间做为约定。
rear初始值=0
3.当队列满时,条件时(rea+1)%maxSize=front【满】
4.对队列为空的条件,rear == front【空】
5.当我们这样分析,队列中有效的数据个数 (rear + maSize - front )%maxSize
6.原来的代码修改成环形队列。
需要修改:
数组队列的初始化
public CircleArray(int maxSize){
//front初始值=0
//rear初始值=0
this.maxSize = maxSize;
arr = new int[maxSize];
}
判断 队列是否满
//判断队列是否为满
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
添加数据到环形队列
//添加数据到队列
public void addQueue(int n){
if (isFull()){
System.out.println("队列已满!!");
return;
}
//数据直接存入
arr[rear] = n;
//rear在最后一个元素的后一位,所以需要进行取模。(防止越界)
rear = (rear + 1) % maxSize;
}
环形队列出列
//获取队列数据,出队列
public int getQueue(){
//判断队列是否为空
if (isEmpty()){
//通过抛异常
throw new RuntimeException("队列为空!!");
}
//front指向数组的第一个元素
//1.先把front对应的值保存到一个临时变量
//2.将front后移,考虑取模
//3.将临时变量返回
int flag = arr[front];
front = (front + 1) % maxSize;
return flag;
}
展示所有队列元素
//展示所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空!!");
return;
}
//思路从front开始,遍历所烧个数据
for (int i = front; i < front + size(); i++){
System.out.printf("arr[%d]=[%d]\n", i % maxSize, arr[i % maxSize]);
}
}
//求出当前有效元素个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
显示队列头
//显示队列头数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空!!");
}
return arr[front];
}
ps:以上笔记均来自尚硅谷韩顺平老师《Java数据结构与java算法》