队列(Queue)与双端队列 (Deque)

简介: 队列详解

 目录

1.队列(Queue)

1.1 概念

1.2 队列的使用

1.3 队列模拟实现

1.4 循环队列

2. 双端队列 (Deque)


1.队列(Queue)

1.1 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear出队列:进行删除操作的一端称为队头Head/Front

image.gif编辑

1.2 队列的使用

Java中,Queue是个接口,底层是通过链表实现的。

image.gif编辑

image.gif编辑

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

public static void main(String[] args) {
    Queue<Integer> q = new LinkedList<>();
    q.offer(1);
    q.offer(2);
    q.offer(3);
    q.offer(4);
    q.offer(5); // 从队尾入队列
    System.out.println(q.size());
    System.out.println(q.peek()); // 获取队头元素
    q.poll();
    System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
    if(q.isEmpty()){
        System.out.println("队列空");
    }else{
        System.out.println(q.size());
    }
}

image.gif

1.3 队列模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构 和 链式结构

image.gif编辑

public class Queue {
    // 双向链表节点
    public static class ListNode{
        ListNode next;
        ListNode prev;
        int value;
        ListNode(int value){
            this.value = value;
        }
    }
    ListNode first; // 队头
    ListNode last; // 队尾
    int size = 0;
    // 入队列---向双向链表位置插入新节点
    public void offer(int e){
        ListNode newNode = new ListNode(e);
        if(first == null){
            first = newNode;
            // last = newNode;
        }else{
            last.next = newNode;
            newNode.prev = last;
            // last = newNode;
        }
        last = newNode;
        size++;
    }
    // 出队列---将双向链表第一个节点删除掉
    public int poll(){
        // 1. 队列为空
        // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
        // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
        int value = 0;
        if(first == null){
            return null;
        }else if(first == last){
            last = null;
            first = null;
        }else{
            value = first.value;
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        --size;
        return value;
    }
    // 获取队头元素---获取链表中第一个节点的值域
    public int peek(){
        if(first == null){
            return null;
        }
        return first.value;
    }
    public int size() {
        return size;
    }
    public boolean isEmpty(){
        return first == null;
    }
}

image.gif

1.4 循环队列

实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。

image.gif编辑

数组下标循环的小技巧

       1. 下标最后再往后(offffset 小于 array.length): index = (index + offffset) % array.length

image.gif编辑

       2. 下标最前再往前(offffset 小于 array.length): index = (index + array.length - offffset) % array.length

image.gif编辑

如何区分空与满

1. 通过添加 size 属性记录

2. 保留一个位置

3. 使用标记

image.gif编辑

2. 双端队列 (Deque)

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque “double ended queue” 的简称。那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

image.gif编辑

Deque是一个接口,使用时必须创建LinkedList的对象。

image.gif

在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口。

Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现

Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现


相关文章
|
人工智能 数据库 云计算
🔥躺着赚佣金!阿里云推荐计算巢服务让你轻松"带货"云计算
阿里云推出“推荐服务赚佣金”计划,无需技术背景,分享链接即可轻松赚取额外收入。高达20%佣金,200+精选服务任选,实时追踪收益,适合个人推广的数字副业!
887 9
|
11月前
|
JSON 安全 生物认证
WhatWeb-网站安全扫描指纹识别
WhatWeb 是一款网站指纹识别工具,用于快速识别目标网站的 Web 服务器类型、CMS、脚本语言、中间件及可能存在的漏洞信息,常用于渗透测试与安全审计。
595 1
|
11月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
人工智能 自然语言处理 监控
阿里云连续6年入选 Gartner®ABI 魔力象限报告,中国唯一!
近日,Gartner发布2025年《分析与商业智能平台魔力象限》报告,阿里云Quick BI第六年入选“挑战者”象限。报告肯定其在可视化、报表及自然语言查询(NLQ)方面的竞争力,并认可其融合AI与BI能力、推动数据分析民主化的创新成果。Quick BI已在零售、金融、制造等多个行业落地应用,助力企业实现高效数据驱动决策。
1036 7
|
机器学习/深度学习 数据可视化 网络架构
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
368 13
YOLOv11改进策略【SPPF】| NeuralPS-2022 Focal Modulation : 使用焦点调制模块优化空间金字塔池化SPPF
|
人工智能 算法 测试技术
AI 研发产品进化论:从 AI 编码助手到 AI 程序员
本次分享由阿里云资深技术专家陈鑫主讲,主题为“AI研发产品进化论:从AI编码助手到AI程序员”。内容涵盖通义灵码在落地过程中的挑战与突破,包括精准度提升、企业级检索增强、自定义扩展及智能体的应用。通过全工程理解、个性化适配和智能体的引入,通义灵码已实现代码补全、单元测试生成、缺陷修复等核心功能,并显著提升了开发者的工作效率。目前,通义灵码已在Vs Code和JetBrains插件市场上获得超过500万次下载,月均采纳率超过30%,并持续优化中。
623 9
|
监控 安全 网络安全
|
消息中间件 存储 资源调度
订单超时怎么处理?我们用这种方案
在电商业务下,许多订单超时场景都在24小时以上,对于超时精度没有那么敏感,并且有海量订单需要批处理,推荐使用基于定时任务的跑批解决方案。
2922 111
订单超时怎么处理?我们用这种方案
|
设计模式 JavaScript 前端开发
原型链有哪些应用场景呢
【10月更文挑战第22天】原型链有哪些应用场景呢
475 1
|
监控 开发者 Python
Python在AOIP(Audio Over IP)方面的应用探讨
Python在AOIP(Audio Over IP)方面的应用探讨
521 0