java怎么实现环形队列
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,今天小编给大家分享一下java怎么实现环形队列的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解
千家信息网最后更新 2025年12月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安全错误
数据库的锁怎样保障安全
腾讯云实例数据库
关于网络安全的歌伴奏
stm32上可以移植的数据库
数据库做学生管理系统
服务器中文插件
进口数据库编程软件价格
sap打印服务器正在运行
美国互联网科技巨头监管
伪基站软件开发刘总
软件开发会不会特别累
软件开发环境是作用
服务器双线设置
如何对数据库两列相减
丰台hp服务器回收多少钱
网络技术在社会工作应用
网络安全法确立了哪些基本原则
数据库 网页
数据库技术思政课心得体会
镇江肯德基网络安全主题餐厅
网络技术主管负责什么
深圳weiqiao网络技术
如何学会掌握网络技术
网络安全监控中心是干啥的
食安网络安全
网络安全管控手段和平台
如何预防网络安全宣传片
网页制作服务器域名
中铁六局网络安全设备采购
电脑当服务器的软件
放置奇兵绿色服务器