数据结构-Queue队列

 一,队列的简单认识

队列也是一种线性数据结构,与栈不同的是,它只能从一端添加元素,从另一端取出元素.定义了一端,另一端也就确定了.

(当然还有一个特殊的双向队列LinkedList除外,它既可以从队首添加元素,也可以移除元素,队尾也是一样的,既可以添加元素,也可以移除元素)

二,队列的实现

Queue<E>

1,void enqueue(E) //添加元素

2,E dequeue()  //移除元素

3,E getFront() //获取第一个元素,但不移除

4,int  getSize() //获取索引

5,boolean isEmpty() //判断队列是否为空

三,队列代码实现,

了解队列的基本功能,对队列的功能进行代码实现,底层逻辑为数组,同样栈也可以实现队列的功能,队列也可以实现栈的功能.

(注意:利用泛型可以对任意类型的数据进行操作)

1,用抽象类来封装相关功能

public interface Queue<T> {// 入队的方法void enqueue(T ele);// 出队的方法T dequeue();// 查看队首元素T getFront();// 队列中元素的数量int getSize();// 判断队列是否为空boolean isEmpty();
}

2,用数组来实现队列功能

import java.util.Optional;
import java.util.Random;// 封装属于自己的数组,使用泛型
public class CycleArray<T> {private T[] data; // 底层数据结构private int size;// 用来保存实际存放元素的个数private int capacity; // 表示容积// 声明索引private int front, tail;public CycleArray() {this(5);}public CycleArray(int capacity) {this.capacity = capacity;this.data = (T[]) new Object[this.capacity + 1];this.size = 0;this.front = this.tail = 0;}// 获取容积的方法public T getFront() {if (this.isEmpty()) {return null;}return this.data[this.front];}// 判断数组是否为空public boolean isEmpty() {return this.front == this.tail;}// 获取数组实际存放元素的个数public int getSize() {return this.size;}/*** 在尾部添加** @param val 插入的值*/public void addTail(T val) {// 在增加之前,判断数组是否已满,如果已满,要进行扩容if ((this.tail + 1) % this.data.length == this.front % this.data.length) {// 扩容操作resize(this.capacity * 2);}this.data[this.tail] = val;// 更新tailthis.tail = (this.tail + 1) % this.data.length;System.out.println("入队:this.front=" + this.front + ",this.tail=" + this.tail);this.size += 1;}// 改变容积的方法private void resize(int newCapacity) {System.out.println("--------resize--------");// 2、 创建一个新数组T[] newArr = (T[]) new Object[newCapacity + 1];// 3、将原来数组的内容转移到新数组for (int i = 1; i <= this.size; i++) {newArr[i - 1] = this.data[this.front];this.front = (this.front + 1) % this.data.length;}this.front = 0;this.tail = this.size;System.out.println("扩容完成:this.front=" + this.front + ",this.tail=" + this.tail);// 4、将newArr赋值给 this.datathis.data = newArr;// 5、将newCapacity 赋值给this.capacitythis.capacity = newCapacity;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();int curIndex = this.front;while (curIndex != this.tail) {sb.append(this.data[curIndex]);curIndex = (curIndex + 1) % this.data.length;}String result = sb.toString();return result.substring(0, result.length() - 1);}// 删除队首元素public Optional<T> removeFromHead() {// 判断是否为空if (this.front == this.tail) {Optional.empty();}Optional<T> result = Optional.of(this.data[this.front]);// 更新frontthis.front = (this.front + 1) % this.data.length;this.size--;System.out.println("出队:this.front=" + this.front + ",this.tail=" + this.tail);if (this.size <= this.capacity / 4 && this.capacity / 2 > 1) {resize(this.capacity / 2);}return result;}
}

3,对功能进行封装

public class CycleQueue<T> implements Queue<T> {private CycleArray<T> data;public CycleQueue() {this.data = new CycleArray<>();}@Overridepublic void enqueue(T ele) {this.data.addTail(ele);}@Overridepublic T dequeue() {return this.data.removeFromHead().orElse(null);}@Overridepublic T getFront() {return this.data.getFront();}@Overridepublic int getSize() {return this.data.getSize();}@Overridepublic boolean isEmpty() {return this.data.isEmpty();}
}

五,队列的复杂度分析

六,队列的优势,及用处

在Java中,队列相比栈和数组的优势:

  1. 先入先出(FIFO)的特性:队列保持元素的顺序,确保先入队的元素先被移出队列,这种特性在很多场景下非常有用;

  2. 动态增长:Java中的队列实现类(如LinkedList等)可以动态增长,不需要事先指定队列的大小,因此更灵活;

  3. 提供了更多的操作:队列通常提供了丰富的操作,如入队、出队、查看队首元素等方法,更符合队列数据结构的特性。

队列可以用于解决诸如排队、调度等问题,包括但不限于:

  1. 任务调度:可以使用队列来实现任务的排队执行,确保按照顺序进行;

  2. 缓冲区:可以用队列来作为缓冲区,平衡生产者和消费者之间的速度差异;

  3. 线程安全:多线程环境下可以利用队列来进行线程安全的数据交换;

  4. BFS算法:在图论中,广度优先搜索算法(BFS)通常使用队列来实现,以便按照层级顺序遍历节点。

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

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

相关文章

在项目中使用CancelToken选择性取消Axios请求

Axios 提供了 CancelToken 类来创建取消标记。取消标记实际上是一个包含 token 标记和 cancel 方法的对象。 1、基本使用方法 const CancelToken axios.CancelToken; const source CancelToken.source();axios.get(/user/12345, {cancelToken: source.token }).catch(functi…

拓扑空间简介

目录 介绍集合论与映射映射相关定义映射&#xff08;map&#xff09;映射的一种分类&#xff1a;一一的和到上的 拓扑空间背景介绍开子集开子集的选择 拓扑拓扑空间常见拓扑拓扑子空间同胚其他重要定义 开覆盖紧致性有限开覆盖紧致性 R R R的紧致性 习题 介绍 这是对梁灿彬的《…

【MIT-PHP-推荐】imi-ai 是一个 ChatGPT 开源项目

mi-ai 是一个 ChatGPT 开源项目&#xff0c;支持聊天、问答、写代码、写文章、做作业等功能。 项目架构合理&#xff0c;代码编写优雅&#xff0c;简单快速部署。前后端代码完全开源&#xff0c;不管是学习自用还是商用二开都很适合。 本项目现已支持 ChatGPT 聊天 AI 和 Emb…

MobaXterm连接VirtualBox虚拟机

目录 1.下载MobaXterm 2.获取连接配置 3.mobaXterm连接虚拟机 4.更好的方案 1.下载MobaXterm 据说MobaXtrem是远程终端的超级全能神器,官网下载地址&#xff1a;MobaXterm free Xserver and tabbed SSH client for Windows 选择适合你的版本&#xff1a;一个是Home Editi…

Normalization,LayerNormalization和BatchNormalization

前言 假设我们的损失函数在空间中是一个曲面&#xff0c;这个曲面可以被我们人为的切出等高线&#xff0c;在采用梯度下降算法的时候&#xff0c;我们沿着梯度反方向迭代&#xff08;梯度方向与等高线垂直&#xff09;&#xff0c;到最后我们会抵达上图曲面的最低点。 在上面的…

学习python的第6天,痛苦焦虑的开始是期待

小号加了她的网易云音乐小号&#xff0c;成为了她的粉丝之一&#xff0c;收到她的私信回复之后&#xff0c;便又开始期待新的回复了&#xff0c;所以嘛&#xff0c;痛苦总是从开始期待开始的............. 昨天学习了python的逻辑控制之 if 和比较 .__eq__(a) 而且在最后顺带…

【开源】SpringBoot框架开发婚恋交友网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

又燃起来了!临深惠湾折扣力度持续铺排

又火了&#xff01; 6月&#xff0c;房企半年报出炉&#xff01; 房企备战“618”&#xff0c;持续安排优惠。 不排除这两天会有更大的宣传&#xff01; 房街团队收集了该市117处待售房产的折扣清单。 需要的粉丝可以扫描底部二维码获取。 上一篇公布了林深汇湾的优惠名单后…

运维SRE-17 自动化批量管理-ansible3

--- - hosts:alltasks:- name: 01 打开冰箱门shell: echo 01 >> /tmp/bingxiang.log- name: 02 把大象放进冰箱里shell: echo 02 >> /tmp/bingxiang.log- name: 03 关上冰箱门shell: echo 03 >> /tmp/bingxiang.log[rootm01 /server/ans/playbook]# cat 05-n…

(响应数据)学习SpringMVC的第三天

响应数据 一 . 传统同步业务数据响应 1.1 请求资源转发与请求资源重定向的区别 请求资源转发时,froward:可不写 二 . 前后端分离异步方式 回写json格式的字符串 1 用RestController代替Controller与 ResponseBody 2 . 直接返回user对象实体 , 即可向 前端ajax 返回json字…

Linux下“一切皆文件”

“Linux下一切皆文件” Linux 下一切皆文件这个说法是指 Linux 系统中的一种设计理念&#xff0c;即将所有设备、资源和进程等抽象为文件或文件夹的形式。这种设计理念的好处在于统一了对待不同类型资源的方式&#xff0c;提供了统一的接口和工具来进行管理和操作。 Linux 下…

漫漫数学之旅033

文章目录 经典格言数学习题古今评注名人小传 - 托马斯赫胥黎 经典格言 如果只有一点知识是危险的&#xff0c;那么知识足够丰富而不危险的人又在哪里呢&#xff1f;——托马斯赫胥黎&#xff08;Thomas Huxley&#xff09; 托马斯赫胥黎这位智慧的先知曾经用一种妙趣横生的方式…