循环队列(Java实现)
循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。队列可以更简单防止伪溢出的发生,但队列大小是固定的。循环队列的使用分两种情况:
1、牺牲一个存储单元,因为队空时,有front=rear,而当队满时,也是front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。Java实现代码如下:
public class CircularQueue {
private int MaxSize; //队列的容量
private int[] arr; //队列的存储结构(用一维数组作为队列的存储结构)
private int front;//队头指针
private int rear;//队尾指针
public CircularQueue(int MaxSize) { //构造一个队列时需要指定队列的容量
this.MaxSize = MaxSize;
arr = new int[MaxSize];
front = 0;
rear = 0;
}
//判空
public boolean isEmpty(){
return rear == front; //当队头指针赶上队尾指针时
}
//判满
public boolean isFull(){
return (rear + 1) % MaxSize == front;
}
//入队
public void addElement(int elem){
try {
if(isFull()){
throw new Exception("队列已满!");
}
arr[rear] = elem; //将数据插入到rear所在的位置
rear = (rear+1 ) % MaxSize;
} catch (Exception e) {
e.printStackTrace();
}
}
//出队方法
public int removeElement(){
int varlue = 0;
try {
if(isEmpty()){
throw new Exception("队列已空!");
}
value = arr[front];
front = (front+1)%MaxSize;
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
2、不用牺牲存储单元,增加一个成员变量(如 count)记录入队元素的个数,当count=0时队列为空,当count=MaxSize时队列满;Java代码如下:
public class CircularQueue {
private int MaxSize; //队列的容量
private int[] arr; //队列的存储结构(用一维数组作为队列的存储结构)
private int front;//队头指针
private int rear;//队尾指针
private int count; //记录入队元素的个数
public CircularQueue(int MaxSize) { //构造一个队列时需要指定队列的容量
this.MaxSize = MaxSize;
arr = new int[MaxSize];
front = 0;
rear = 0;
count = 0;
}
//判空
public boolean isEmpty(){
return count == 0;
}
//判满
public boolean isFull(){
return count == MaxSize;
}
//入队
public void addElement(int elem){
try {
if(isFull()){
throw new Exception("队列已满!");
}
arr[rear] = elem; //将数据插入到rear所在的位置
rear = (rear+1 ) % MaxSize;
count++;
} catch (Exception e) {
e.printStackTrace();
}
}
//出队方法
public int removeElement(){
int varlue = 0;
try {
if(isEmpty()){
throw new Exception("队列已空!");
}
value = arr[front];
front = (front+1)%MaxSize;
count--;
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现