java数据结构YZP专栏-----队列

Java 数据结构之队列(Queue)详解 但需要注意的是,由于数组的容量是固定的,当队列已满时,无法再添加新的元素,除非进行元素的出队操作。通过enqueue()方法将元素入队,dequeue()方法将元素出队,peek()方法返回队列头部元素,size()方法返回队列当前元素个数,isEmpty()方法和isFull()方法检查队列是否为空或已满。Deque接口还提供了一些其他方法,如size()用于返回双端队列中的元素个数,isEmpty()用于判断双端队列是否为空,clear()用于清空双端队列中的所有元素等。 阅读详情
主文章(数据结构的索引目录—进不去就说明我还没写完)
https://blog.youkuaiyun.com/grd_java/article/details/122377505
模拟数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
源码(码云):https://gitee.com/yin_zhipeng/data_structures_and_algorithms_in_java.git
队列
  1. 一种先入先出的数据结构
  2. 每次访问数据,都只能从队列的头部访问,插入数据只能从队列尾部访问(普通队列)

1.数组实现(Array Implementation)

动画演示
  1. 入队列
    请添加图片描述
  2. 出队列
    请添加图片描述
  3. 循环队列
    请添加图片描述
思路
  1. 创建数组作为队列,定义capacity表示队列(数组)大小,有效的存储空间只有capacity-1个,需要保留一个空间做判断(具体看上图循环队列)
  2. 定义front和tail表示队列的头指针和尾指针
  3. 假设队列9个空间,既然要实现循环,那么第10个元素,应该插入到第一个位置(第一个位置为空的话)
  4. 通过10%capacity=1,可以算出第10个元素应该插入到第一位,但是如果1位置有元素,表示不能插入,队列满
  5. 如果front==rear表示队列为空,
  6. 如果(tail+1)%capacity== front 表示队列满,不能继续插入数据
  7. 后移一位下标(front/tail+ 1)%capacity
  8. 有效元素个数tail + capacity - head; 加capacity是因为tail-head可能是负数比如-1,而%capacity的值是循环队列的下标,,-3%2=-1,不是+1,会下标越界
  9. 当我们想取到队列第三个值的时候,(head+3)%capacity即可
代码:com/yzpnb/data_structures/queues/array_implementation/ArrayQueue.java
  1. 运行效果
    在这里插入图片描述
public class ArrayQueue<T> {
    private T[] queue;//数组作为队列
    private int capacity;//队列容量
    private int head;//头指针
    private int tail;//尾部指针,指向末尾元素的下一个位置,如果tail的下一个位置就是head,则不允许插入数据

    //构造
    public ArrayQueue(int capacity){
        queue = newArray(capacity);//队列
        this.capacity = capacity;//容量
        head = 0;//头指针
        tail = 0;//尾指针
    }

    /**
     * 构建数组,直接转型为T(泛型)
     * @param size 大小
     */
    private T[] newArray(int size){
        return (T[])new Object[size];
    }
    //入队列
    public boolean enQueue(T o){
        queue[tail] = o;
        int newTail = (tail+1) % capacity;//指针后移一位
        if(newTail == head)
            throw new IndexOutOfBoundsException("Queue full!!!队列满");
        tail = newTail;
        return true;
    }
    //出队列
    public T deQueue(){
        if(head == tail)
            throw new IndexOutOfBoundsException("Queue empty!!!队列为空");
        T deQueue = queue[head];//获取队列头数据
        queue[head] = null;//置为null
        head = (head + 1) % capacity;//下标后移
        return deQueue;
    }

    //获取指定下标结点,以用户角度看,下标不是循环的
    public T get(int i){
        int size = size();//获取有效个数
        if(i<0 || i > size) {
            final String msg = "Index " + i + ", queue size " + size;
            throw new IndexOutOfBoundsException(msg+"下标超出队列当前元素数量");
        }
        int index = (head + i) % capacity;//找到用户想要元素的下标
        return queue[index];
    }
    //有效元素个数tail + capacity - head; 加capacity是因为tail-head可能是负数比如-1
    public int size(){
        // Can't use % here because it's not mod: -3 % 2 is -1, not +1.
        int diff = tail - head;
        if (diff < 0)//如果是负数
            diff += capacity;//+capacity
        return diff;
    }


    public void printer(){
        System.out.print("队列:");
        int size = size();
        for(int i = 0;i<size;i++){
            System.out.print(queue[((head+i)%capacity)]+" ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        ArrayQueue<Integer> queue = new ArrayQueue<Integer>(4);
        queue.enQueue(1);queue.enQueue(2);queue.enQueue(3);
        queue.printer();
        System.out.println("出队列"+queue.deQueue());
        System.out.println("出队列"+queue.deQueue());
        queue.printer();
        queue.enQueue(4);
        queue.printer();
        System.out.println("第二个元素:"+queue.get(1));
    }
}

2.链表实现(Linked List Implementation

动画演示
  1. 入队列
    请添加图片描述
  2. 出队列
    请添加图片描述
实现思路
  1. 定义head和tail分别指向队头和队尾结点,构造队列时,直接创建一个空结点作为头
  2. 插入结点时,tail指向的结点的后缀,指向新插入结点,tail指向新插入结点
  3. 出队列,返回当前头结点(队列第二个结点,第一个是辅助),head指向当前头结点的后继
代码:com/yzpnb/data_structures/queues/linked_list_implementation/LinkedQueue.java
  1. 运行效果
    在这里插入图片描述
import java.util.Collection;

public class LinkedQueue<E> {
    /**
     * Linked list node class 单链表结点
     */
    static class Node<E> {
        E item;

        Node<E> next;//后继

        Node(E x) { item = x; }
    }
    private final int capacity;//最大容量
    transient Node<E> head;//头
    private transient Node<E> last;//尾

    /**
     * 构造队列
     */
    public LinkedQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node<E>(null);
    }
    //根据集合构造
    public LinkedQueue(Collection<? extends E> c) {
        this(Integer.MAX_VALUE);
        int n = 0;
        for (E e : c) {
            if (e == null)
                throw new NullPointerException();
            if (n == capacity)
                throw new IllegalStateException("Queue full");
            enqueue(e);
            ++n;
        }
    }

    //入队列
    public void enqueue(E e) {
        Node<E> node = new Node<E>(e);
        last = last.next = node;
    }

    public E dequeue(){
        E peek = peek();
        head = head.next;
        return peek;
    }

    //获取头结点(队列第二个结点)
    public E peek() {
        Node<E> first = head.next;
        if (first == null)
            return null;
        else
            return first.item;
    }

    public void printer(){
        System.out.print("队列:");
        Node<E> first = head.next;
        while(first != null){
            System.out.print(first.item+" ");
            first = first.next;
        }
        System.out.println();
    }
    public static void main(String[] args) {
        LinkedQueue<Integer> queue = new LinkedQueue<Integer>(4);
        queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);
        queue.printer();
        System.out.println("出队列"+queue.dequeue());
        System.out.println("出队列"+queue.dequeue());
        queue.printer();
        System.out.println("入队列4");
        queue.enqueue(4);
        queue.printer();
    }

}
从平衡车到寻迹小车:IMU963RA九轴陀螺仪实战避坑与四元数融合指南 本文详细解析了IMU963RA九轴陀螺仪在机器人姿态控制中的应用,重点探讨了从六轴升级到九轴系统的技术路径及四元数融合算法。通过实战案例,揭示了如何利用地磁计补偿陀螺积分漂移,并提供硬件集成、传感器校准及算法实现的完整解决方案,有效将8小时漂移控制在2度以内。 阅读详情

相关推荐

openstack卷分离异常问题处理

对于 2023-05-10 之后的所有 OpenStack 版本,需要将Nova 配置为向 Cinder 发送服务令牌,然后 Cinder 接收该令牌。cinder.conf处添加service_token_role配置。1.修改nova的config文件添加如下配置。确定service role 是否存在。有关详细信息,请参阅。重启nova cinder 服务。nova-compute日志。cinder-api日志。

weixin_43391291的博客 477

Java数据结构-队列

队列,循环队列

Vampire的博客 3576

Nvidia Isaac Sim图形界面 入门教程 2024(3)

在使用Isaac Sim时,最先接触到的应该是它的图形界面,此处将简单介绍图形界面中常用的一些组件:Isaac Sim的界面的常用内容可以分为几个板块。

m0_56661101的博客 4547

Java数据结构和算法——队列

本篇博客我们介绍了队列的三种形式,分别是单向队列、双向队列以及优先级队列。其实大家听名字也可以听得出来他们之间的区别,单向队列遵循先进先出的原则,而且一端只能插入,另一端只能删除。双向队列则两端都可插入和删除,如果限制双向队列的某一段的方法,则可以达到和单向队列同样的功能。最后优先级队列,则是在插入元素的时候进行了优先级别排序,在实际应用中单项队列和优先级队列使用的比较多。后面讲解了堆这种数据结构,我们会用堆来实现优先级队列,改善优先级队列插入元素的时间。

2301_78145678的博客 426

机器学习——径向基函数(RBF)神经网络

目录 一、什么是基函数 二、什么是径向基函数 三、为什么RBF神经网络使用一个径向基函数作为隐含层的激活函数 四、参数训练 五、RBF网络vs BP网络和 SVM 一、什么是基函数 著名的傅里叶变换是指:n个有参(权值)的正、余弦三角函数基的和式可以等价的表示任意一个周期函数,这里的“基”和我们数学中说的坐标基或向量基含义相同,即坐标空间中任意一个向量都可以用基向量的线性和表示出来。 因此,我们引入函数空间的概念,函数空间中的每个连续函数可以表示为基函数的线性组合,就像向量空间中的每..

CHWB2580的博客 6272

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 404

java数据结构YZP专栏版-----主目录-----持续更新

本文相当于目录方便快速检索内容,没有实际内容,只做索引

殷志鹏的博客 370

171、运动控制中的标定:摩擦力与死区补偿标定

摘要(149字) 运动控制系统中的摩擦力与死区补偿是提升精度的关键。摩擦力分为静摩擦、库仑摩擦和粘滞摩擦,其中Stribeck效应是低速抖动的主因;死区则表现为控制信号的无效区间。有效标定方法包括恒速测试(摩擦力)和斜坡响应法(死区)。补偿策略需采用分段前馈和动态调整,避免过度补偿导致振荡。实践中要注意机械状态检查、补偿量限幅,并定期重新标定。硬件升级配合算法补偿才能实现最优控制,标定工作应优先于PID参数调整。

m0_50546716的博客 227

Java全栈技术体系汇总----主目录----持续更新

文章目录一、Java基础1. Java容器2. IO/BIO/NIO3. 多线程与高并发4. JVM5. 设计模式6. 数据结构与算法7. JDK冷门好用的特性8. Web9. 第三方jar工具10. XML二、前端必会1. Css2. 语法基础3. 移动端开发4. webpack5. VUE6. 必会算法三、Java框架1. Spring框架2. Spring MVC框架3. MyBatis框架4. Spring boot5. Spring Cloud6. Dubbo7. Spring Security四

殷志鹏的博客 2294

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

cesium 气象云(体积云)

本文介绍了基于Cesium的气象云渲染技术方案,其核心是通过GPU加速的光线投射算法实现气象云的三维可视化。方案采用分层架构设计:GPU计算层由顶点着色器和片段着色器组成,负责光线投射计算、3D纹理采样和颜色映射;CPU控制层处理数据预处理、纹理创建和参数配置。关键技术包括:顶点着色器计算相机位置和光线方向,片段着色器实现光线步进采样、颜色映射和半透明混合。该方案高效解决了气象数据与地理场景的融合问题,支持云图、温度场等复杂三维气象数据的实时渲染,具有高真实感和良好性能。

God's asylum的博客 1204

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 282

【教培管家】小程序实战(五):体验课预约——从流量到转化的闭环

本节我们通过变量状态管理和数据联动,实现了孩子选择和日期选定。下一篇我们继续讲解预约页面,根据选择的日期来筛选排课,供用户进行预约。

低代码布道师的博客 1562

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 232

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 346

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 126

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 196

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 106

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 630

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 382

java框架大全

java框架大全

qq_39326137的博客 183

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 359

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 298

Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

【代码】Java实现批量线段相交检测(跨积判定+扫描线优化与踩坑复盘)

m0_64476639的博客 326

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 329
上一篇: vue前后端分离后台管理系统(权限管理,登录),对接后端SpringSecurity,实现权限管理功能
下一篇: JVM基础到调优详细笔记----持续更新
ydenergy_殷志鹏
博客等级 码龄7年 5885粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值