队列的算法

数组队列

数组的子集

主要方法addLast( )和removeFirst( )

public interface IQueueDesc<E>{void enqueue(E e);E    dequeue();E	 getFront();int  getSize();boolean isEmpty();
}public class QueueMyList<E> implements IQueueDesc<E{MyArray<E> array;public QueueMyArray(){this(10);}public QueueMyArray(int capacity){array = new MyArray<>)(capacity);}// 入队public void enqueue(E e){array.addLast(e);}// 出队public E    dequeue(){array.removeFirst();}// 获取第一个元素public E    getFront(){array.getValueByInde(0);}public int    getSize(){return array.getSize();}public boolean    isEmpty(){return array.isEmpty();}
}

缺点:

①队首出列后,后面的全部向前移动一个补缺

②出队移动补缺麻烦 时间复杂度O(n)

解决方案

不要往前移动,减少复杂度,采用双指针,front和tail,就可以解决这个问题。

此时缺点:

如果不断入队和出队,前面就会空了一大截,前面一大片空间就浪费了。

循环队列

主要是尾指针移到末尾后又会移动到队首。

问题:

1.如何判断队列是空的?

front == tail,可能是空也可能是满,防止歧义,强行规定front == tail就是空!!!

2.如何判断队列是满的?

tail + 1 == front 就是满了,要浪费1个空格子

(tail + 1) % 数组长度 == front 队列为满

3.指针怎么指向

front指向队首,tail指向队尾的下一个存储单元

使用循环队列实现

初始化

public class QueueMyList<E> implements IQueueDesc<E>{private E[] data;private int size;private int front;private int tail;public QueueMyArray(){this(10);}public QueueMyArray(int capacity){// 要随时记得 我们自己定义的循环队列故意浪费了一个坑 所以要capacity+1this.data = (E[])new Object[capacity+1];//参数初始化this.size = 0;this.front = 0;this.tail = 0;}// 入队public void enqueue(E e){// 队列满了if(((tail+1) % data.length) == front){// 扩容resize(getCapacity()*2);}// 正常插入队里data[tail] = e;// 注意!!!!!!!这个地方容易出错 出界!不能用getCapacitytail = (tail+1) % data.length;size++;}// 出队public E dequeue(){if(isEmpty()){throw new RunTimeException("队列为空。。。");}size--;int result = data[front];// 记得处理游离对象!!!!!!!!!!!!!!!!!!!data[front] = null;front = (front+1) % data.length;// 缩容!!变成原来四分之一长度才缩容,要不到2如果缩容就变成 1/2 = 0 就缩没了// 如果设置一半会和getCapacity()/2 != 0有冲突 还要加判断麻烦if(size == getCapacity()/4 && getCapacity()/2 != 0){// 缩成原来一半resize(getCapacity()/2);}return result;}// 获取第一个元素public E  getFront(){if(isEmpty()){throw new RunTimeException("队列为空。。。");}return data[front];}public int getSize(){return  size;}public boolean isEmpty(){return tail == front;}public int getCapacity(){// 注意!!!!这点非常容易错return data.length - 1;}private void resize(int capacity){// 一定要记得+1啊!!!!!!!!!!!E[] newData = (E[])new Object[capacity+1];// 拷贝是全部移动到新数组的头部!!而不是原来位置for(int i=0;i < size;i++){newData[i] = data[front+i % data.length];}data = newData;front = 0;tail = size;}
}

数组队列先插10万个数,再出队10万个数耗时4.4秒

循环队列先插10万个数,再出队10万个数耗时0.01秒

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

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

相关文章

c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)

OpenSSL的下载和环境配置 请参考&#xff1a;openssl下载安装教程 步骤&#xff1a;官网下载->安装到选定目录->配置环境变量->打开命令窗口检查是否安装成功 注意&#xff1a; 打开命令窗口&#xff08;快捷键winr,在弹出窗口内输入cmd按回车&#xff09;&#xff0…

docker 学习笔记

Docker 1. 初识 Docker 快速构建、运行、管理应用的工具 1.1 安装 删除已有的 docker 版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine安装所需的软件包 首…

2024/03/15(网络编程·day3)

一、思维导图 二、模拟面试题 什么是IP地址&#xff1f; IP地址是主机在网络中的唯一标识。 分为IPv4和IPv6&#xff0c; IPv4由4字节32位二进制数组成&#xff0c;通常使用点分十进制表示&#xff0c;例如192.168.117.85 &#xff0c;其中每个十进制数的范围都在0-255. IPv6由…

【解读】Synopsys发布2024年开源安全和风险分析报告OSSRA

软件供应链管理中&#xff0c;许可证和安全合规性至关重要。开源组件和库可降低风险&#xff0c;但需了解许可证内容。Synopsys 2023年审计发现&#xff0c;超过一半的代码库存在许可证冲突。MIT许可证是最常用的宽松许可证&#xff0c;但也与其他许可证存在不兼容风险。点此获…

Android SystemServer进程解析

SystemServer进程在android系统中占了举足轻重的地位&#xff0c;系统的所有服务和SystemUI都是由它启动。 一、SystemServer进程主函数流程 1、主函数三部曲 //frameworks/base/services/java/com/android/server/SystemServer.java /** * The main entry point from zy…

51单片机LED8*8点阵显示坤坤跳舞打篮球画面

我们作为一名合格的 ikun&#xff0c;专业的小黑子&#xff0c;这个重要的知识必须学会。 先看效果&#xff1a; 51LED点阵_鸡你太美 这里我们首先要用到延时函数Delay&#xff1a; void Delay(unsigned int xms) {unsigned char i, j;while(xms--){ i 2;j 239;do{while (-…

AWS云上面的k8s统一日志收集(Fluent Bit+EKS+CW)

目标 k8s上面的常见的统一日志方案是EFK&#xff0c;具体如下&#xff1a; E:elasticsearch;F:fluentd;K:kibana 这里我们变成了使用fluentd的AWS替代品Fluent Bit&#xff0c;直接将日志输出到CloudWatch组。不需要E和K了。不过&#xff0c;这样仅仅用于AWS EKS。 步骤 给…

Scala--01--简介、环境搭建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. Scala简介1.1 Scala是什么&#xff1f;官网&#xff1a; [https://scala-lang.org/](https://scala-lang.org/)官方文档&#xff1a; [https://docs.scala-lang.…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

Tomcat不识别请求路径中的特殊字符{}

报错内容解决方法1 /opt/tomcat/conf/catalina.properties --> tomcat.util.http.parser.HttpParser.requestTargetAllow|{} 解决方法2 /opt/tomcat/conf/server.xml --> relaxedQueryChars"[]|{}-^&#x60;&quot;<>" relaxedPathChars"[]|{…

分布式CAP理论

CAP理论&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;。是Eric Brewer在2000年提出的&#xff0c;用于描述分布式系统基本性质的定理。这三个性质在分布式系统…

193基于matlab的基于两轮驱动机器人的自适应轨迹跟踪算法

基于matlab的基于两轮驱动机器人的自适应轨迹跟踪算法&#xff0c;将被跟踪轨迹分段作为跟踪直线处理&#xff0c;相邻离散点之间为一段新的被跟踪轨迹。程序已调通&#xff0c;可直接运行。 193 自适应轨迹跟踪算法 两轮驱动机器人 - 小红书 (xiaohongshu.com)