用java以数组为底层结构创建循环队列

用java以数组为底层结构创建循环队列

循环队列相对于普通队列最大的变化就是添加了一个头指针head,尾指针tail。原先的普通数组队列当入队列再出队列之后,前面就会空出位置,如果要再添加元素的话只能往尾部添加,当添加到容积大小的索引时就会自动扩容往后添加,但永远都不能在前面出队的空出的位置添加,前面的位置就浪费了。循环队列很有效的解决了这一问题,通过两个指针对capacity容积取余来改变指针指向位置从而杜绝上述问题。

尾指针是入队位置的索引,每入队一个元素后,tail++。头指针是出队元素的索引,每出队一个元素后,head++。但是怎么才能循环呢?当尾指针等于capacity时,说明需要改变尾指针到开头位置来插入元素了,tail=(tail+1)%capacity。如果用这样的方法,那队满条件也得改变:(tail+1)%capacity==head。

代码如下:

looparr:底层结构:循环数组

public class LoopArr<T> {private T[] value;    //保存数据int size;   //实际存放个数int capacity;   //容积private int head;private int tail;//  构造方法public LoopArr(int capacity){//因为队满时要空出来一个位置,所以容积需要相较于之前的普通数组加1if(capacity<=0){this.capacity=11;}else {this.capacity=capacity+1;}this.size=0;this.head=this.tail=0;this.value=(T[])(new Object[this.capacity]);//不可以直接new一个T[]类型,所以需要先new一个Object[]类型然后转为T[]}//判断数组是否为空public boolean IsEmpty(){if(this.head==this.tail){return true;}else{return false;}}//向数组中添加元素public void add(T data){//扩容if((this.tail+1)%this.capacity==this.head){   //如果数组满了就重新设置容积resize((this.capacity-1)*2+1);  //先把容积变为原先的容积,再×2,加1是循环队列队满时有一个空}this.value[this.tail]=data;//因为是循环的,当队尾指到最后了就需要重新回到第一个位置继续加this.tail=(this.tail+1)%this.capacity;this.size++;}//移除队首元素public T remove(){//缩容if(this.size<=this.capacity/4&&this.capacity/2>0){resize((this.capacity-1)/2+1);  //与扩容同理}if(IsEmpty()){return null;}else{T e=this.value[head];this.value[head]=null;//head指向末尾时需要重新循环到开头,所以如下this.head=(this.head+1)%this.capacity;this.size--;return e;}}//重新给容积private void resize(int newcapacity){//由于数组的容积都是不变的所以需要新建一个数组T [] newvalue=(T[])(new Object[newcapacity]);//转移数组for (int i = 0; i < this.size; i++) {newvalue[i]=this.value[(this.head+i)%this.capacity];    //给新数组赋值,此时capacity还没有变,所以%this.capacity}//改变容器,数组this.value=newvalue;this.capacity=newcapacity;this.head=0;    //从头开始this.tail=this.size;    //尾指针指向最后一个元素的下一个位置也就是size}public int getHead() {return head;}public int getTail() {return tail;}//获取索引位置的值public T getindexdata(int index){if(index<0||index>this.capacity){throw new IllegalArgumentException("index is invalid.");}return this.value[index];}//获取实际长度public int getSize() {return this.size;}//获取数组的容积public int getCapacity() {return this.capacity;}
}

队列接口:用于被循环队列实现功能

public interface selfqueue<T> {//入队void offer(T e);//出队T poll();//查看队首元素T peak();//队列中元素的个数int getsize();//队列是否为空boolean IsEmpty();
}

LoopQueue:

public class LoopQueue<T> implements selfqueue<T> {private LoopArr<T> data;public LoopQueue(){this.data=new LoopArr<T>(10);}//入队public void offer(T e) {this.data.add(e);}//出队public T poll() {return this.data.remove();}//获得队首元素public T peak() {return this.data.getindexdata(this.data.getHead());}//获取长度public int getsize() {return this.data.getSize();}//获取容积public int getcapacity(){return this.data.getCapacity();}//判断是否为空public boolean IsEmpty() {return this.data.IsEmpty();}
}

测试:

public class queuetest<T> {public void test(LoopQueue queue, List<T> list){//开始时间long startTime=System.nanoTime();//入队System.out.println("队尾先进,入队顺序:");for (int i = 0; i < list.size(); i++) {queue.offer(list.get(i));System.out.print(list.get(i)+" ");}System.out.println("size:"+queue.getsize());System.out.println("capacity:"+queue.getcapacity());System.out.println("队列中元素个数:"+queue.getsize());System.out.println("队头元素:"+queue.peak());//出队System.out.println("队头先出,出队顺序:");while(!queue.IsEmpty()){T e= (T) queue.poll();System.out.print(e+" ");}//结束时间long endTime=System.nanoTime();System.out.println("总耗时:"+(endTime-startTime)/1000000000.0+"s");}public static void main(String[] args) {queuetest<Integer> qt=new queuetest<Integer>();selfqueue<Integer> queue=new LoopQueue<Integer>();   //继承了selfqueue的LoopQueue来实现selfqueueList<Integer> list=new ArrayList<Integer>();Random r=new Random();for (int i = 0; i < 30; i++) {list.add(r.nextInt(100));}qt.test((LoopQueue) queue,list);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫

Flask框架小程序后端分离开发学习笔记《4》向服务器端发送模拟请求-爬虫 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 下面代码&#xff0c;是一个比较老的版本了&#xff0c;可以借鉴一下。 import socket import ssldef p…

贪心算法 ——硬币兑换、区间调度、

硬币兑换&#xff1a; from book&#xff1a;挑战程序设计竞赛 思路&#xff1a;优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

大数据质量管制规范示例

大数据质量管制规范示例 一、前提概要二、相关概念三、管理原则四、治理委员五、应用管理六、查验方式七、考核比率八、扣分标准九、责任划分十、追责范围十一、其它条例十二、总结 一、前提概要 在当今大数据信息时代&#xff0c;大数据平台&#xff08;大数据平台开发规范示…

Linux之Shell脚本编程入门

Linux之Shell脚本编程入门 文章目录 Linux之Shell脚本编程入门Shell脚本编程入门1. 脚本格式2. 第一个Shell脚本&#xff1a;hello World3.第二个 shell脚本&#xff1a;duo命令处理4. shell中变量4.1 常用系统变量4.2 自定义变量4.3 特殊字符: $n4.4 特殊变量: $#4.5 特殊变量…

Spark在降本增效中的一些思考

背景 在大环境不好的情况下,本司也开始了“降本增效”&#xff0c;本文探讨一下&#xff0c;在这种背景下 Spark怎么做的降本增效。 Yarn 基于 EMR CPU 是xlarge&#xff0c;也就是内存和核的比例在7:1左右的 &#xff0c;磁盘是基于 NVMe SSD Spark 3.5.0(也是刚由3.1 升级而…

关于大模型学习中遇到的3

来源&#xff1a;网络 Embedding模型 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…

中仕教育:社会人员可以报名三支一扶吗?

三支一扶是针对高校应届毕业生的一种考试&#xff0c;社会人员并不满足报考条件&#xff0c;所以不能报考。 三支一扶报考条件&#xff1a; 1.应届毕业生或者毕业两年内未就业的往届毕业生。 2.专科以上学历 3.遵纪守法&#xff0c;作风良好。 不同地区的考试要求不同&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的&#xff1f;二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中&#xff0c;异步JavaScript和XML&#xff08;AJAX&#xff09;已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法&#xff1a;data() 和 c_str()&#xff0c;都是返回该字符串的const char类型&#xff0c;那如何转换成非const的char呢&#xff1f; 下面展示三种方法&#xff1a; 强转&#xff1a;char* char_test (char*)test.c_str();使用string的地址&#xff…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一&#xff1a;我的方法 2 方法二&#xff1a;动态规划 3 方法三&#xff1a;双指针 菜鸟做题第一周&#xff0c;语言是 C 42. 接雨水 1 方法一&#xff1a;我的方法 Warning&#xff1a;这是我的智障做法&#xff0c;请勿模仿 我只能说它教会…

17.正则表达式

正则表达式 正则表达式1.字符类2. 逻辑运算符3. 预定义字符4. 数量词5. 数据爬取6. 按要求爬取6.1 贪婪爬取6.2 非贪婪爬取 7. 字符串中使用正则表达式的方法8. 分组括号8.1 匹配和捕获分组8.2 引用和后向引用8.3 零宽断言8.4 分组嵌套与递归8.5 忽略大小写8.6 代码示例 正则表…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列&#xff0c;如&#xff1a;1 1 2 3 5 8 ... 其前两项为1&#xff0c;第3项开始&#xff0c;每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

MySQL---视图索引

表定义&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令&#xff1a;vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码&#xff0c;注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器&#xff0c;有时候需要启动SSH会话&#xff0c;启动的时候发现没反应&#xff0c;且事件日志显示&#xff1a;无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边&#xff0c;发现“无默…

怎样陪孩子度过一个充实的假期?

你好&#xff0c;我是白丽丽。之前我作为得到图书的负责人&#xff0c;为你介绍过李希贵校长的《家庭教育指南》这本书的使用方法&#xff0c;今天我和你聊聊&#xff0c;怎么用这本书来迎接假期里的一个个挑战&#xff0c;帮助你和孩子度过一个充实的假期。 作为家长&#xf…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP&#xff08;Certified Information Security Professional&#xff09;中文全称注册信息安全专业人员认证&#xff0c;是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能&#xff0c;推出的代表国家对信息安全专业人员能力认可的证书。 C…

数据结构——排序

前言&#xff1a;哈喽小伙伴们好久不见&#xff0c;也是顺利的考完试迎来了寒假。众所周知&#xff0c;不怕同学是学霸&#xff0c;就怕学霸放寒假&#xff0c;假期身为弯道超车的最佳时间&#xff0c;我们定然是不能懒散的度过。 今天我们就一起来学习数据结构初阶的终章——…

不要让努力变成一种自虐

当我们为了工作而连续熬夜&#xff0c;不顾身体健康&#xff0c;可能只是在自虐。举个例子&#xff0c;长时间的工作压力和过度努力可能导致身体和心理的疲惫&#xff0c;反而影响到工作效率和生活质量。正确的努力包括合理的工作时间、科学的工作方式&#xff0c;以及关注自己…

嵌入式软件工程师面试题——2025校招社招通用(Linux篇)(二十六)

说明&#xff1a; 面试群&#xff0c;群号&#xff1a; 228447240面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但…