【数据结构】队列,你必须知道的内部原理!!!

news2024/9/23 12:04:31

                                      🌞🌞🌞生活本就沉闷,但跑起来就会有风 ~~~

前言:

🌟🌟Hello家人们,这期讲解数据结构队列的基础知识,希望你能帮到屏幕前的你。

📚️上期博客在这里:http://t.csdnimg.cn/WJjIy

📚️感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

目录

     📚️ 1.什么是对队列

🎥1.1队列概念:

🎥1.2入队列:

🎥1.3出队列:

       📚️2.队列方法的底层模拟

🎥2.1引导:

 🎥2.2初始化链表:

 🎥2.3入队列:

 🎥2.4出队列:

  🎥2.5输出队列头元素:

  🎥2.6队列长度,打印,非空判断:

     📚️3.队列的应用

 🎬️3.1队列的方法

   🎬️3.2队列的使用代码:

     📚️4.总结语


                                             那么正片开始~~~🎬️🎬️🎬️

     📚️ 1.什么是对队列

🎥1.1队列概念:

只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
的性质

🎥1.2入队列:

进行插入操作的一端称为队尾(Tail/Rear

🎥1.3出队列:

进行删除操作的一端称为队头(Head/front)
图片实例:
💡💡💡 总结来说,队列就是像我们平时排队一样,先到先得,第一个人站在队头,最后一
个人站在 队尾,这样是否更形象呢~~~

       📚️2.队列方法的底层模拟

                  这部分是比较重要的一部分~~~

🎥2.1引导:

       💬在上述描述中可以看到,队列用数组实现,但是当出队列时,可以看到前面的空间都浪费了,所以小编在这里将用链表进行队列的模拟。

图解如下:

💡💡可以看到,front索引前面的数据出队列后就为空了,导致前面的位置就直接浪费了。

 🎥2.2初始化链表:

代码如下:

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;  //有效数据

       💬小编在这里创建了一个双向链表(双向链表博客在这里:http://t.csdnimg.cn/8vB1R)方便一系列操作,并且多初始化了一个变量表示有效数据。

 🎥2.3入队列:

代码如下:

public void offer(int e){
        ListNode node=new ListNode(e);
        if(first==null){   //判断链表是否为空
            first= node;
            last=node;
        }else {            //正常插入
            node.prev=last;
            last.next=node;
            node.next=null;
            last=node;
        }
        size++;             //有效数据加一
    }

        💬在链接节点时要进行链表是否为空的判断,如果为空,就将头结点和尾巴节点都给插入节点。反之,就直接进行正常的尾插法即可。

 🎥2.4出队列:

 代码如下:

 public int poll(){
        if(isEmpty()){     //判断是否为空
            System.out.println("队列为空,无法输出数据");
            return -1;
        }
        if(first==last){   //当只有一个节点时
            int ret=first.value;
            first=null;
            last=null;
            size--;
            return ret;
        }                  //正常进行链表的头节点删除
        int ret=first.value;
        first=first.next;
        first.prev=null;
        size--;            //有效数据减一
        return ret;

    }

     💬这里还是一样的在出队列时,要判断链表是否为空,在进行头节点的删除。

注意:在判空的前提上还要分多个节点和一个节点的头节点的删除情况。

  🎥2.5输出队列头元素:

代码如下:

public int peek(){
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return -1;
        }
        return first.value;
    }

       💬这里还是要先判断链表的状态,最后返回头节点的域值的数据即可,不用做其他操作,得到值就OK。

  🎥2.6队列长度,打印,非空判断:

代码如下:


    public int size() {   //获取队列的长度
        return size;
    }
    
    private boolean isEmpty(){  //判断队列是否为空
       if(first==null){
           return true;
       }
       return false;
    }

    public void display(){    //打印队列
        ListNode cur=first;
        while (cur!=null) {    //遍历链表
            System.out.print(cur.value + " ");
            cur = cur.next;
        }
        System.out.println();  //换行,方便测试
    }

       💬这里就相比起来,就比前面的更简单,小编就不再过多赘述。

     📚️3.队列的应用

 🎬️3.1队列的方法

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

   🎬️3.2队列的使用代码:

代码实例:

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());
        }
    }

      💬这里就类似于方法的调用,这里小编就通过注解来解释咯~~~

     📚️4.总结语

      💬💬小编通过前几期的链表,顺序表,栈,和本篇的队列学习发现在这些数据结构中的底层代码编译思路几乎一样,都是要熟悉对应数据结构的原理,以及对应条件判断

通过对底层模拟的实现,可以帮助我们理解对应数据结构方法的使用原理。

       🌅🌅🌅还是那句话,多练!哈哈哈~~~~最后希望与诸君共勉,共同进步!!!


                  💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                                下期预告:栈和队列的相关例题解析🌟🌟

                                          😊😊  期待你的关注~~~

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

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

相关文章

书生基础岛1-开发全链路

涌现能力&#xff1a;知识到运用的能力。 开源工具箱&#xff1a; 预训练&#xff1a; 微调&#xff1a; 部署&#xff1a; 智能体&#xff1a; 智能体&#xff1a; 知识库构建&#xff1a; RAG&#xff1a;

初识C++ · C++11(1)

目录 前言&#xff1a; 1 统一列表初始化 2 声明 2.1 auto 2.2 decltype 2.3 nullptr 2.4 stl的部分变化 3 右值引用和移动语义 前言&#xff1a; 在C11之前&#xff0c;C98的出现使得C看起来更像是一门独立的语言&#xff0c;C委员会成立后&#xff0c;对外宣称的是5…

神鸟云PCDN业务招募

短Z业务--支持nat0~nat4 省内调度&#xff0c;晚高峰 跑量9成 配置要求: 线路&#xff1a;单条上行30M 硬件&#xff1a;32线程 64内存条 240G系统盘 1G:2T固态盘单价&#xff1a;移动1900 电联2500 镜像下载&#xff1a;http://oss.download.birdicloud.com/box/Cent…

三层架构:IOCDI

三层架构 我们先看一下三层架构是什么 我们想要实现这三层架构的分离&#xff0c;实现一个类实现一个功能。 我们先建立一个包&#xff0c;然后在包下创建接口&#xff0c;然后再实现接口。从而实现三层架构分离。 IOC 为了实现这三层架构的分离&#xff0c;我们把创建类的…

协同过滤之矩阵分解算法问题详解

1、矩阵分解出现的原因 传统的协同过滤依赖用户的历史行为来推测用户对未评分商品的评分&#xff08;潜在兴趣&#xff09;&#xff0c;不需要了解物品的具体属性&#xff0c;也不需要知道用户的具体偏好&#xff0c;只需要历史评分数据就可以进行推荐&#xff0c;存在以下问题…

Query @azure/openai with images?

题意&#xff1a;使用图像与azure/openai进行交互或查询 问题背景&#xff1a; On chat.openai.com I can upload an image and ask chatgpt a question about it, with the existing openai and azure/openai api however there doesnt seem to be a way to do this? The Ch…

QT+ffmpeg环境配置

1.新建一个qt项目 2.下载ffmpeg文件Releases BtbN/FFmpeg-Builds GitHub 3.解压后&#xff0c;打开qt项目地址&#xff0c;将ffmpeg文件复制进qt项目 4.打开新建的qt项目头文件新加入如下内容&#xff1a;&#xff08;如有需求可按需求添加&#xff09; INCLUDEPATH $$PWD/i…

【多线程-从零开始-捌】阻塞队列,消费者生产者模型

什么是阻塞队列 阻塞队里是在普通的队列&#xff08;先进先出队列&#xff09;基础上&#xff0c;做出了扩充 线程安全 标准库中原有的队列 Queue 和其子类&#xff0c;默认都是线程不安全的 具有阻塞特性 如果队列为空&#xff0c;进行出队列操作&#xff0c;此时就会出现阻…

114套新闻网站源码+采集规则+安装使用教程-网络公司建站资源

运行环境 PHP5.6MYSQL5.6 – 系统版本支持WindowsLinux 源码介绍 1.版权问题 本114套新闻源码均由EYOUCMS系统二次开发而成&#xff0c;因为系统不涉及会员功能&#xff0c;所以没有版权纠纷问题&#xff0c;客户可以一直免费使用。 2.自动采集发布 系统自身集成了网易,新…

odoo17 翻译一个小bug

odoo17 翻译一个小bug 用户界面的没译过来 标红处&#xff0c;但在zh_CN.po中明显已经翻译过来了&#xff0c;采取暴力点的&#xff0c;直接把base下的base.pot删除&#xff0c;再更新一下&#xff0c;可以正常显示了

【区块链+社会公益】腾讯志愿者公益平台 | FISCO BCOS应用案例

由腾讯技术公益团队主导的“公益志愿者平台”&#xff0c;旨在链接公益组织和志愿者。公益组织入驻平台后可以发布公 益活动、征集志愿者&#xff0c;志愿者可以在平台报名参加公益活动、获得公益组织和平台联合颁发的志愿服务证书。 腾讯技术公益采用了微众区块链技术对 “公…

【Linux】网络编程套接字Scoket:UDP网络编程

目录 一、了解UDP协议 二、了解端口和IP地址 三、套接字概述与Socket的概念 四、Socket的类型 五、 Socket的信息数据结构 六、网络字节序与主机字节序的互相转换 七、地址转换函数 八、UDP网络编程流程及相关函数 socket函数 bind函数 recvfrom函数 sendto函数 …

网站开发涉及到的技术内容介绍——后端PHP(2)

网站开发涉及到的技术内容介绍——后端PHP(1)https://blog.csdn.net/xiaochenXIHUA/article/details/141000752?spm=1001.2014.3001.5501 一、PHP的常用函数 1.1、PHP文件夹的常用函数 PHP的目录常用函数 序号目录常用函数说明1$_SERVER[DOCUMENT_ROOT]获取到PHP项目的根目…

C++ -- 负载均衡式在线OJ (一)

一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ&#xff0c;实现类似leetcode的题目列表、在线提交、编译、运行等功能。 2.项目结构 该项目一共三个模块&#xff1a; comm : 公共模块compile_server : 编译与运行模块oj_server : 获取题目列表&#xff0c;查看题…

Spring Boot项目缺少配置文件的解决方法:IDEA

本文介绍在IntelliJ IDEA软件中&#xff0c;为Spring Boot项目添加配置文件的操作方法。 最近&#xff0c;在IntelliJ IDEA软件中新创建了一个Spring Boot项目&#xff0c;是通过如下图所示的方法直接新建的。 但是&#xff0c;随后发现这样创建的Spring Boot项目没有配置文件。…

Threejs实现鼠标控制相机+键盘控制模型+点击指定点控制模型移动

1.前言 Threejs实现鼠标控制相机功能,键盘控制模型功能,点击指定点控制模型移动功能 键盘使用WASD控制模型移动效果图: 鼠标移动可控制相机的位置控制模型移动到指定点效果图: 2.功能拆分 根据以上效果图,可以得到以下三个主要实现的功能 鼠标移动可以使相机跟随通过键…

leetcode-121-买卖股票的最佳时机

原理&#xff1a; 核心原理&#xff1a; 如果我们真的在买卖股票&#xff0c;我们肯定会想&#xff1a;如果我是在历史最低点买入就好了&#xff01;该历史最低点是指卖出当天之前的历史最低点而不是全局最低点。 实现步骤&#xff1a; 1、初始化变量preprices[0]表示历史股…

20240809 每日AI必读资讯

乒乓球AI机器人赢了人类&#xff01;正反手灵活转换&#xff0c;擦网球高球都能接 - 谷歌发布首个达到人类竞技水平的机器人Agent&#xff0c;挑战乒乓球赛场。 - 机器人通过学习大量乒乓球状态数据&#xff0c;掌握了正手上旋球、反手瞄准等技能&#xff0c;展现出高速运动…

CTFHUB | web进阶 | PHP | Bypass disable_function | bypass iconv 2

开启题目 查看源码&#xff0c;发现可以蚁剑连接 进入之后无发现&#xff0c;使用插件 iconv 上传脚本 进入之后发现多了一个 .antproxy.php&#xff0c;复制文件名重新拼接连接 进入终端&#xff0c;查看根目录之后发现了有两个 flag 文件&#xff0c;之后发现了本题的 flag

STM32CUBEMX+PWM多一个尖峰的问题

问题描述&#xff1a;使用TIM2的通道3产生PWM波形&#xff0c;产生n个数量的波形后&#xff0c;在停止的时候会有一个尖峰。 怀疑是自动重载值临界的时候有问题&#xff0c;对重载值多减一个值&#xff0c;但还是有这个问题。 解决&#xff1a;电路是默认低电平&#xff0c;我…