数据结构-04-队列

news2025/1/10 3:22:42

1-队列的结构和特点

       生活中我们排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的"队列"。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队enqueue(),放一个数据到队列尾部;出队dequeue(),从队列头部取一个元素。

  比如我们依次入队列元素A-B-C-D,如下图所示:

比如我们依次出队列元素A-B-C,如下图所示:

       所以队列跟栈一样,也是一种操作受限的线性表数据结构。队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列Disruptor、Linux环形缓存,都用到了循环并发队列;Java concurrent并发包利用ArrayBlockingQueue来实现公平锁等。

2-队列的实现

      队列可以用数组来实现,也可以用链表来实现。用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈。同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。下面是利用数组实现简易版的队列,里面优化点有很多,大家可以自行实现。

public class MyArrayQueue {
    private Object[] elementData;//存储元素的数组
    private int capacity;//容量
    private int head;//队列的头部下标
    private int tail;//队列的尾部下标

    public MyArrayQueue(int capacity) {
        this.elementData = new Object[capacity];
        this.capacity = capacity;
        this.head = 0;
        this.tail = 0;
    }

    // 入队操作
    public boolean enqueue(Object item) {
        // 数组空间不够了,直接返回false,入队失败。
        if (tail == capacity){
            return false;//这个是简单实现---不涉及到数据,满了直接返回,下标不移动
        }
        // 将item放到下标为count的位置,并且count加一
        elementData[tail] = item;
        ++tail;
        return true;
    }

    // 出队操作
    public Object dequeue() {
        // 如果head == tail 表示队列为空
        if (head == tail) return null;
        // 返回下标为count-1的数组元素,并且栈中元素个数count减一
        Object tmp = elementData[head];
        ++head;
        return tmp;
    }
}

Jdk源码中也有队列相关的,其中Queue接口,

public interface Queue<E> extends Collection<E>

还有一些高级队列,比如阻塞队列,双端队列,并发队列等等。

3-队列的使用

      在实际的业务开发过程中,我们很少自己开发一个队列来实现业务的需求;直接使用sdk中封装好的各种高级队列来满足我们业务需求。比如阻塞队列,并发队列,环状队列;以及我们熟知线程池中,我们对过多的任务也会放进我们使用的高级队列中。

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

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

相关文章

问题记录-maven依赖升级或替换(简单版)

问题背景 项目被检测到有高危漏洞&#xff0c;需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令&#xff0c;会将当前项目的信息打印出来&#xff0c;…

只有stm32基础,学嵌入式linux得几年?

只有stm32基础&#xff0c;学嵌入式linux得几年&#xff1f; 你这几句话基本把好几个方向都说了个遍&#xff0c;但是实际你没有这么多精力 这里32的基础意义不大&#xff0c;主要是C语言基础和之前项目中的经验&#xff0c;要是这俩个都不错&#xff0c;你可以直接上手 linux&…

统信UOS之UOS ID云服务

原文链接&#xff1a;统信UOS桌面操作系统1060上使用UOS ID hello&#xff0c;大家好啊&#xff01;在这个数字化、智能化的时代&#xff0c;操作系统不仅仅是简单的软件平台&#xff0c;更是我们日常工作和生活的得力助手。今天&#xff0c;我要给大家介绍的是关于统信UOS桌面…

led护眼灯真的能护眼吗??央视公认好用的五款护眼台灯推荐

2020年我国的近视人数将达到7亿人左右&#xff0c;我国的儿童年少年为主要的近视人群。5岁-15岁群体近视患病率高达到约78.96%&#xff0c;16岁-24岁群体近视患病率高达到约95%。我国儿童青少年近视患病率居高不下&#xff0c;会降低我国未来的人口素质与国民健康素质&#xff…

代码随想录算法训练营第五十一天【动态规划part12】 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.确定dp数组及其下标含义&#xff1a; 第i天&#xff0c;状态为j&#xff0c;所剩的最多现金为dp[i][j]。 出现冷冻期后&#xff…

熟练运用这些黑盒测试知识点,月薪翻倍不是难题

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

layui提示框没有渲染bug解决

bug&#xff1a;使用layui时或许是依赖导入又或是ideal和浏览器缓存问题导致前面明明正常的页面显示&#xff0c;后面出现提示框没有css样式&#xff0c;弹出框没有背景css 效果如下 解决后 解决方法 在你的代码中引入layer.js 我这是jsp页面 <script type"text/jav…

PDF文件如何限制打印?限制打印清晰度?

想要限制PDF文件的打印功能&#xff0c;想要限制PDF文件打印清晰度&#xff0c;都可以通过设置限制编辑来达到目的。 打开PDF编辑器&#xff0c;找到设置限制编辑的界面&#xff0c;切换到加密状态&#xff0c;然后我们就看到 有印刷许可。勾选【权限密码】输入一个PDF密码&am…

适配器模式-C++实现

适配器是一种结构型设计模式&#xff0c;用于将一个接口转换为另一个客户端所需要的接口。该模式通过创建一个适配器对象&#xff0c;使不兼容的接口可以协同工作。 适配器模式主要分为三个角色&#xff1a;适配器类、目标类、适配者类。 适配器模式分为对象适配器和类适配器…

交叉熵损失函数(Cross-Entropy Loss Function)

交叉熵损失函数&#xff08;Cross-Entropy Loss Function&#xff09; 在处理机器学习或深度学习问题时&#xff0c;损失/成本函数用于在训练期间优化模型。目标几乎总是最小化损失函数。损失越低&#xff0c;模型越好。交叉熵损失是最重要的成本函数。它用于优化分类模型。对…

堆栈_有效括号

题比较特殊&#xff0c;主要在于它的所有要输入&#xff0c;都是左括号开头&#xff0c;没有右括号开头的&#xff0c;比如"] ["&#xff0c;这种是不算为括号的&#xff0c;由于必然是对称的&#xff0c;若能符合&#xff0c;因而直接在遇到右括号时&#xff0c;检查…

【Java 并发编程】进程线程、lock、设计模式、线程池...

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从入门到入坟 Java 并发编程 并发编程多线程的入门类和接口线程组和线程优先级线程的状态及主要转化方法线程间的通信重排序和 happens-beforevolatilesynchronized 与锁CAS 与原子操作AQS计划任务Stream 并行计…

java深浅拷贝

对于Java拷贝的理解 在java语言中&#xff0c;当我们需要拷贝一个对象的时候&#xff0c;常见的会有两种方式的拷贝&#xff1a;深拷贝和浅拷贝。 浅拷贝 只是拷贝了原对象的地址&#xff0c;所以原对象的任何值发生改变的时候&#xff0c;拷贝对象的值也会随之而发生变化。 拿…

广州华锐视点提供AI虚拟主播定制,为品牌注入新活力!

随着科技的飞速发展&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。在这个信息爆炸的时代&#xff0c;如何让您的品牌在众多竞争对手中脱颖而出&#xff0c;成为行业的佼佼者&#xff1f;答案就是——AI虚拟主播&#xff01; 广州华锐视点提供AI数字人定制服务&#x…

详解云WAF:免费GOODWAF归来

文前聊心 说说这篇文章的目的&#xff1a; 介绍一下自己的开发升级的项目&#xff1a;GOODWAF&#xff0c;看名字也能看的出来这是一款防火墙&#xff0c;但它不同于现在的软件防火墙&#xff0c;它是一款云WAF防火墙。 其实GOODWAF这个IP概念前两年就存在了&#xff0c;但为什…

计算机组成原理-存储系统基本概念

文章目录 现代计算机的结构总览存储器的层次化结构各存储器的速度与价格存储器的分类&#xff08;按层次分类&#xff09;存储器的分类&#xff08;按存储介质分类&#xff09;存储器的分类&#xff08;按存取方式分类&#xff09;存储器的分类&#xff08;按信息的可更改性分类…

Qt串口助手

QT5 串口助手 ​ 由于C课程作业的需要&#xff0c;用QT5写了个简陋的串口助手。只作为一个简单的案例以供参考&#xff0c;默认读者具有C基础和了解简单的Qt操作。 功能展示 【用QT写了个简单的串口助手】 准备工作 Qt自带有<QSerialPort> 库, 可以方便地配置和调用…

neo4j使用之超神之旅

1.查询整个链路中任意一段的关系类型是“department”的链路数据 MATCH path (n)-[r1 *0..7 {relation_type:once2once}]-(m) where id(n)0 and any(x in relationships(path) where type(x)department) return path效果图&#xff1a; 2.查询整个链路中最后一段的关系类型…

代币化:2024年的金融浪潮预示着什么?

自“TradFi”领袖到加密专家&#xff0c;各方预测代币化机会高达数十万亿。虽然已有引人注目的用例&#xff0c;但与未来几年可能在链上转移的大量数字化资产相比&#xff0c;这些仅是冰山一角。 代币化何时会变为洪流&#xff1f;什么阻碍了其发展&#xff1f; 今年10月&…

TA-Lib学习研究笔记——Price Transform (五)

TA-Lib学习研究笔记——Price Transform &#xff08;五&#xff09; 1.AVGPRICE Average Price 函数名&#xff1a;AVGPRICE 名称&#xff1a;平均价格函数 语法&#xff1a; real AVGPRICE(open, high, low, close) df[AVGPRICE] tlb.AVGPRICE(df[open],df[high],df[low…