前言
本文将用java语言实现常用数据结构之一: 环形队列
一、环形队列是什么?
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
https://baike.baidu.com/item/%E9%98%9F%E5%88%97/14580481?fr=aladdin
二、具体实现
1.思路分析
- front含义做出调整 指向第一个元素 而不是前面 front=0
- rear 也调整 指向最后元素的后一个位置,空出一个位置作为约定 rear=0
- 当队列满时, 原来的条件是 rear==maxSize -1 现在改为 (rear+1)%maxSize=front(满)
- 因为要预留一个空间 所以rear +1 如果front 一直是零的话 就是整除 取出一个前移一位 放进一个后移一位0,10–1,1 而maxSize一直是10
- 为空的条件是rear==front
- 队列有效数据的个数是 (rear +maxSize-front)%maxSize
private int maxSize;
private int front;//队列头
private int rear; //队列尾
private int[] arr;//存放数据 ,模拟队列
构造方法 确定初始值
front=0;//指向队列的头部前一个位置
rear=0;//指向队列尾部的具体位置,就是队列最后一个数据的位置
这两个初始值关系到怎么确定当前数据的位置,要注意
public circleQueue(int arrMaxSize){
maxSize=arrMaxSize;
arr=new int[maxSize];//空出一个位置
front=0;//指向队列的头部前一个位置
rear=0;//指向队列尾部的具体位置,就是队列最后一个数据的位置
}
2.获取、添加、删除、遍历队列方法的实现
辅助方法 为满条件发生了变化 因为预留了一个空间 front 在变化 但是一定容量的时候 rear与front 的距离是不变的 当(rear+1)%maxSize==front就满了
//判断队列是否满
public boolean isFull(){
return (rear+1)%maxSize==front;
}
public boolean isEmpty(){
return rear==front;
}
添加:首先判断是否满了 如果是 则直接返回
如果还没满 让头(rear)后移( rear=(rear+1)%maxSize;) 并赋值;
public void addQueue(int n){
if (isFull()){
System.out.println("已经满了");
return;
}
//rear后移 因为先进先出 头部分先被取到 添加从尾部开始添加
arr[rear]=i;
//先后移 必须考虑取模 ,即不能越界 如果大了 就把rear 放在前面取模
/**
* rear最大时 (rear+1)%maxSize 会等于front 9+1/10 rear 的位置不可能超过maxSize
* 因为会循环,不可能越界
*/
rear=(rear+1)%maxSize;
}
出列
//获取队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能获取数据");
}
//front前移 因为先进先出 头部分先被取到
// front++;
// return arr[front];
int value=arr[front];
front=(front +1)%maxSize;
return value;
}
显示队列头部,不是出列 不删除数据
/**
* 显示队列的头部 不是取数据
*/
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列空,不能获取数据");
}
return arr[front+1];
}
遍历队列 使用fo循环
public void showQueue(){
if (isEmpty()){
System.out.println("没有数据");
return;
}
for (int i=front;i<front+size();i++){
System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
}
}
求出当前队列有效数据 的个数
//求出当前队列有效数据 的个数
public int size(){
//rear
return (rear +maxSize-front)%maxSize;
}
总结+技巧+语法
小算法: //求出当前队列有效数据 的个数
a= (rear +maxSize-front)%maxSize;
环形后移 front=(front +1)%maxSize;