java怎么实现环形队列
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,今天小编给大家分享一下java怎么实现环形队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解
千家信息网最后更新 2025年02月02日java怎么实现环形队列
今天小编给大家分享一下java怎么实现环形队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
1、普通队列存在什么问题?
队列大家都知道,有几个重要的属性:
rear:指向队列的尾巴,即最后一个元素所在的位置,初始值为-1 front:指向队列的头部的前一个位置,初始值也为-1 capacity:队列的容量
空队列的rear和front都等于-1,入队时,front不动,rear++,当 rear == capacity - 1
时,队列已满;出队时,rear不动,front++,当front == rear
时,队列为空。看起来很完美,但实际上有问题。假如一个队列capacity = 3
,入队了三个元素,此时front = -1; rear = 2
,然后再将三个元素都出队,此时front = 2, rear = 2
。这时队列明明是空的,但是却不能再入队元素的,因为满足rear = capacity - 1
,也就是相当于这队列是一次性的,用过之后就不能再用了,即使为空也不能再入队了,造成空间的浪费,所以环形队列就出现了。
2、环形队列实现思路:
环形队列中的几个重要属性:
rear:指向队列尾巴的后一个位置,初始值为0 front:指向队列的头部,即第一个元素所在的位置,初始值为0 capacity:队列的容量
下面是环形队列的一些算法:
队列为空时: front == rear
队列已满时: (rear + 1) % capacity == front
获取队列元素个数: (rear + capacity - front) % capacity
入队操作时: rear = (rear + 1) % capacity
出队操作时: front = (front + 1) % capacity;
判断队列是否已满是环形队列中最重要也是最难理解的地方。假如有一个队列capacity = 3
,入队操作如下:
第一个元素入队: front = 0
,因为(rear + 1) % capacity = 1 % 3 != front
,所以元素可以入队,元素入队后rear = 1
;第二个元素入队: front = 0
,因为(rear + 1) % capacity = 2 % 3 != front
,所以元素可以入队,元素入队后rear = 2
;第三个元素入队: front = 0
,因为(rear + 1) % capacity = 3 % 3 == front
,所以元素不能入队,队列已满;
队列容量明明是3,只入队了两个元素就告诉我队列满了?没错,这种判断队列是否已满的算法需要牺牲数组的一个空间。
现在进行出队操作:
第一个元素出队: front = 1
,rear = 2
,(rear + 1) % capacity = 3 % 3 = 0 != front
。
可以发现,当一个元素出队后,又满足入队条件了,所以数组空间就可以重复利用了。
3、代码实操:
public class CircleQueue {
private int capacity;
private int front;
private int rear;
private Object[] arr;
public CircleQueue(int capacity){
this.capacity = capacity;
this.arr = new Object[capacity];
this.front = 0;
this.rear = 0;
}
public boolean isFull(){
return (rear + 1) % capacity == front;
}
public boolean isEmpty(){
return rear == front;
}
public void addQueue(E e){
if (isFull()){
throw new RuntimeException("队列已满,入队失败");
}
arr[rear] = e;
// rear指针后移
rear = (rear + 1) % capacity;
}
public E getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空,出队失败");
}
Eval = (E) arr[front];
front = (front + 1) % capacity;
return val;
}
public int getSize(){
return (rear + capacity - front) % capacity;
}
// 遍历
public void showQueue(){
if (isEmpty()){
return;
}
for (int i = front; i < front + getSize(); i++) {
System.out.printf("arr[%d]=%d\n", i%capacity, arr[i%capacity]);
}
}
public static void main(String[] args){
CircleQueue queue = new CircleQueue<>(3);
queue.addQueue(1);
queue.addQueue(2);
queue.showQueue();
//queue.addQueue(3);
System.out.println(queue.getSize());
System.out.println(queue.getQueue());;
queue.addQueue(3);
queue.showQueue();
}
}
以上就是"java怎么实现环形队列"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
队列
元素
环形
位置
指向
知识
篇文章
重要
三个
容量
空间
内容
头部
尾巴
属性
所在
数组
算法
问题
不同
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
关于网络安全演讲稿六百字
企业级服务器应用场景分类
网络安全教育pp
csiq图像质量评价数据库
数据库课后习题第五版
数字证书下载软件开发
数据库merge是干嘛的
SQL可以建设数据库后端嘛
软件开发到哪个城市好
上海多知互联网科技公司怎么样
怎么用服务器挂京东脚本
免费的软件开发
软件测试数据库面试问题
崩坏三PC端服务器
智慧云平台投标客户端服务器地址
光盘文件无法读取数据库
哈尔滨工程大学网络安全防护
肇庆网络安全企业
电脑打不开国家数据库
深圳化境网络技术
网络技术提取文字
软件开发甲方要版权怎么办
泽思网络安全工程师
网络安全手抄报写什么内容 简单
和平精英的服务器最多几个
银行数据库APP下载
我的世界服务器转化桌插件
银川网络安全师要求
creo工作区与服务器同步
数据库或者查询