队列的使用,基于数组和基于链表的模拟实现,题目练习

LittleFS+NANDFLASH软硬件配置详情 littleFS文件系统说明及移植过程 阅读详情

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
队列是针对线性表,进行了封装和限制,核心操作有三个:入队列,出队列,获取队首元素,队列的特点是“先进先出”
队列的底层实现有两种,链表和数组,这篇博客会分别模拟这两种底层实现,同时搭配算法题的练习来学习队列
这个专栏的数据结构是代码都是用Java来写的,JavaSE专栏现在已经全部更新完成,铁汁们复习基础知识时非常推荐使用,可以试一下💪💪💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据结构专栏
🎇复习Java基础知识:Java学习之旅,从入门到进阶
🎇铁汁们对于数据结构基础的各种核心知识(不太常用的也有😆),都可以在上面的数据结构专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,队列简介

队列跟栈是比较类似的,只不过栈是一端进,一端出,所以先进的最后才能出
而队列有两端,队尾进,队首出,队列是先进先出

在这里插入图片描述

在实际开发中,队列的使用是远远多于栈的,因为队列中的元素进出有“先来后到”的顺序,有些耗时比较长的操作没办法一口气处理完,需要按照顺序一个一个处理,为了保证处理的顺序不乱,就可以把数据放到队列中

队列在标准库中的实现就是Queue,Queue是一个接口,是没办法直接创建实例的,只能创建其他类,来实现接口

add方法和offer方法就是入队列,一般使用offer(因为听起来比较吉利🐵)队首元素,入队列方法在传入元素类型不匹配时会抛出异常
元素出队列就是remove和poll方法,并且返回该元素,element和peek是取出队首元素

当队列为空时,remove和element方法会抛出异常,poll方法和peek方法会返回null,一般使用的是不抛出异常的版本,就是使用poll和peek

在这里插入图片描述



创建接口时,实现类可以是LinkedList,那为什么用LinkedList就可以了呢,按ctrl键点入LinkedList看一下,LinkedList实现了Deque接口(Deque是双端队列,两头都能进,两头都能出),而Deque接口又继承了Queue接口,所以LinkedList就相当于是实现了Queue接口

在这里插入图片描述



ArrayList是没有实现Queue接口的,不能作为Queue的实现类,但是队列是完全可以基于数组来实现的,下面博客会聊到

创建一个队列,用offer在里面添加元素,当列表为空时,使用poll会返回null,使用remove则会直接报错

import java.util.LinkedList;
import java.util.Queue;

public class Test {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(1);
        queue.offer(2);
        queue.offer(3);
        queue.offer(4);
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.remove());
    }`在这里插入代码片`
}

在这里插入图片描述


判定栈是否为空,就可以使用empty(),或者isempty()方法,但是队列是没有这些方法的,一般是用peek取出队首元素,如果返回值为null,就说明队列为空

if(queue.peek() == null){
            
        }

2,队列模拟实现(基于链表)

我们模拟实现一个自己的队列MyQueue,基于单链表来实现,存储的元素类型为String

首先搞一个Node类,表示节点

public class Node {
    public String val;
    public Node next;

    public Node(String val) {
        this.val = val;
        this.next = null;
    }
}

用链表模拟实现队列,元素入队列就进行尾插,元素出队列就进行头删,读取队首元素就返回头节点val即可

offer方法就是先判断下head是否为null,如果不为null就直接在tail后插入新节点

    public void offer(String val){
        Node newNode = new Node(val);
        if(head == null){
            head = newNode;
            tail = newNode;
            return;
        }
        tail.next = newNode;
        tail = newNode;
    }



再重写下toString方法,利用字符串拼接,写好后就可以在main方法中测试offer方法了

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        Node cur = head;
        while(cur != null){
            stringBuilder.append(cur.val);
            if(cur.next != null){
                stringBuilder.append(",");
            }
            cur = cur.next;
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
public class Test {
    public static void main(String[] args) {
        MyQueue myQueue = new MyQueue();
        myQueue.offer("aaa");
        myQueue.offer("bbb");
        myQueue.offer("ccc");
        System.out.println(myQueue);
    }
}

在这里插入图片描述



poll方法就是删除头部元素,并返回元素值,head为null时就返回null,head不为null时就head = head.next即可,如果删除后head等于null了,要把tail也改为null

    public String poll(){
        if(head == null){
            return null;
        }
        String val = head.val;
        head = head.next;
        if(head == null){
            tail = null;
        }
        return val;
    }



peek方法就只需要判断下head是不是null,再返回head.val即可

    public String peek(){
        if(head == null){
            return null;
        }
        return head.val;
    }



再写个isEmpty()和size()方法

    public boolean isEmpty(){
        return head == null;
    }

    public int size(){
        int size = 0;
        for(Node cur = head;head != null;head = head.next){
            size++;
        }
        return size;
    }

3,数组队列原理

日常开发中,创建队列更多还是基于数组来实现,因为数组中元素出入的效率就比较高,虽然ArrayList不能是实现类,但是我们可以用ArrayDeque作为实现类

        Queue<Integer> queue = new ArrayDeque<>();

这个ArrayDeque也可以作为双端队列的实现类(双端队列有addLast,addFirst,removeLast,removeFirst方法)

        Deque<Integer> deque = new ArrayDeque<>();



那队列是如何用数组来实现的呢,我们画图来分析下原理,首先创建出一个空的数组,创建两个引用head和tail,当head等于tail时,队列为空

在这里插入图片描述



当元素入队列时,元素存到tail指向的位置,tail再往后移动一位

在这里插入图片描述


那元素出队列时应该如何解决呢,如果把数组后面的元素都往前移动一格,那时间复杂度就是O(N),这样效率是很低的

在这里插入图片描述



那把元素出队列时,把head往后移动一位,并不真正的删除元素,只是把之前head指向的这块元素标记为无效,这样数组就无需进行元素搬运

在这里插入图片描述


按照这种思想,那tail到达数组末尾的时候,就并不意味着队列已经满了,前面可能又有一大片的空白区域,就可以让tail拐到前面继续存储数据

在这里插入图片描述



数组队列当作环形来看会更好理解一些,铁汁们可以自己画图模拟下,初始时head和tail都在下标0处,元素入队列时,tail往后顺时针移动

在这里插入图片描述



元素出队列时,head顺时针移动,如下图,两个元素出队列(数组中的元素实际上是没有删除的,只是标记为无效了,后续元素入队列直接把这块这之前的值给覆盖掉,图中为了美观,就把元素删除了)

在这里插入图片描述

接着一直往队列里面加入元素,当head和tail重合时,就说明队列已经满了

在这里插入图片描述

当队列为空时,head和tail也是重合的,所以靠head和tail重合是无法判断出队列满了,那想要判断,有两个办法

直接浪费一个格子,当head走到tail前面一个格子的位置时,就说明队列已经满了

在这里插入图片描述

还有一种更简单直接的做法,就是引入一个size变量,表示队列中元素的个数,如果size为0,队列就为空;如果size等于arr.length,那数组就为满



数组这种方案,相比链表有三大优点:

  1. 使用数组时的效率要高于链表
    数组中元素入队列和出队列就是简单的head++和tail++,而链表再修改应用的指向时,还涉及到一个间接寻址操作(需要先读取到引用的值,得到地址,再根据地址来访问内存空间)
  2. 使用数组对于队列中元素个数的上限是可控的
    对于链表来说,可以一直往里面插入元素,如果代码出现了bug,可能不会报错,就是一直插入,直到把内存耗尽,结果就可能会造成整个程序的瘫痪😅
    而对于数组版本,如果不去自动扩容的话,出现类似的问题,就能在入队列时及时报错,把问题影响范围缩小
  3. 数组版本的空间利用率更高
    因为链表版本还要保存next引用

4,队列模拟实现(基于数组)

接下来就基于数组来模拟实现队列,存储元素类型为String

首先创建个数组,以及head、tail、size这些属性,构造方法无参的默认数组长度为1000,有参的可以自己指定数组长度

public class MyQueueByArray {
    private String[] arr = null;

    private int head = 0;
    private int tail = 0;
    private int size = 0;

    public MyQueueByArray() {
        arr = new String[1000];
    }
    
    public MyQueueByArray(int capacity){
        arr = new String[capacity];
    }
}

offer方法,首先判断下队列是否已经满了,也就是比较size是否等于length,队列满了可以选择扩容(这样就没有控制元素上限的作用了),也可以选择直接抛出异常,

    public void offer(String val){
        if(size == arr.length){
            return;
        }
        arr[tail] = val;
        tail++;
        if(tail == arr.length){
            tail = 0;
        }
        size++;
    }



poll方法,首先判断下队列是否为空,如果为空就返回null,不为空就返回arr[head],size- -,head++,如果head等于arr.length,就让head等于0,移动到数组头部

    public String poll(){
        if(size == 0){
            return null;
        }
        String val = arr[head];
        head++;
        size--;
        if(head == arr.length){
            head = 0;
        }
        return val;
    }



重写toString方法,创建一个拼接字符串,让cur从head的位置开始,往后移动,每次都把cur的元素添加到拼接字符串中,直到拼接字符串中添加了size个元素,当cur等于arr.length时,就让cur等于0,回到数组开头

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        int cur = head;
        for(int i = 0;i < size;i++){
            stringBuilder.append(arr[cur]);
            cur++;
            if(cur == arr.length){
                cur = 0;
            }
            if(i < size - 1){
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }



peek方法就是当队列不为空时,就直接返回arr[head]

    public String peek(){
        if(size == 0){
            return null;
        }
        return arr[head];
    }



接下来聊个题外话,在前面的offer方法中,我们写的是先让tail++,接着判断tail是否等于arr.length,如果等于arr.length了,再让tail = 0
但是铁汁们可能看到过直接求余数的写法(这个写法还是挺流行的),但是这个写法就真的好吗?

        tail++;
        if(tail == arr.length){
            tail = 0;
        }
       tail = (tail + 1) % arr.length;

tail + 1的意思就是tail++,再对arr.length进行取模运算,当tail + 1等于arr.length的时候,取模后结果会等于0,其他情况取模后结果还是tail + 1;这个写法可能看起来比较牛,一行代码就搞定了,但是这样写真的比第一种写法好吗

评价代码看两个方面:

  1. 对于开发效率的影响,是否可读性好,是否容易理解,是否好维护
  2. 对于运行效率的影响,也就是程序的执行效率

取模写法从可读性上看,是不如第一种写法的
不考虑编译器优化的话,第一种写法的执行效率也更高,第一种写法在大部分情况下,cpu进行一次赋值操作,进行一次比较操作即可(tail等于arr.length时,才会进行两次赋值操作) ;而第二种写法,每次都会有赋值操作和取模操作,而取模指令的效率是低于比较指令的,编译器在执行第二种写法时,不会真的去进行取模运算,还是会优化成第一种写法😂

5,用队列实现栈

在这里插入图片描述
力扣链接

这个题目没啥实用价值,就是纯考察我们的代码能力,要求使用两个队列来模拟一个栈的功能,队列的特点是先进先出,栈的特点是先进后出

可以这样搞,A和B两个队列,入栈时把元素加到A队列中,元素需要出栈时,就把队列A中的元素逐个取出来,加到队列B中,队列A中剩最后一个元素时,直接删除即可,接着交换下队列A和队列B的指向,后面进行入栈操作还是把元素加到队列A中去

再额外写个swap方法,先创建个tmp引用把引用A保存下来,接着再进行交换

class MyStack {

    private Queue<Integer> A = new ArrayDeque<>();
    private Queue<Integer> B = new ArrayDeque<>();

    public MyStack() {
        
    }
    
    public void push(int x) {
        A.offer(x);
    }
    
    public int pop() {
        while(A.size() > 1){
            int n = A.poll();
            B.offer(n);
        }
        int result = A.poll();
        swap();
        return result;
    }
    
    public int top() {
        while(A.size() > 1){
            int n = A.poll();
            B.offer(n);
        }
        int result = A.poll();
        B.offer(result);
        swap();
        return result;
    }
    
    public boolean empty() {
        return A.isEmpty();
    }

    public void swap(){
        Queue<Integer> tmp = A;
        A = B;
        B = tmp;
    }
}

6,用栈实现队列

在这里插入图片描述

力扣链接

用两个栈来模拟实现队列,也是让元素再两个栈之间来回导,两个栈A和B,入队列时把元素添加到A栈中,需要删除元素时,再把元素从栈中导到B中,这时候B的队首元素就是要删除或者要取出的元素

在这里插入图片描述

但是这个题目,如果再交换A和B的引用,就不行了,因为在A中先入队列的元素是在栈底,而在B中先入队列的元素却是在栈底,如果交换引用顺序就乱掉了,因此,还要再把B中的元素再导入到A中,确保原来的顺序不变

后面入队列就还是加到A中,规则就是先入的在栈底,后入的在栈顶

class MyQueue {
    private Stack<Integer> A = new Stack<>();
    private Stack<Integer> B = new Stack<>();

    public MyQueue() {
        
    }
    
    public void push(int x) {
        A.push(x);
    }
    
    public int pop() {
        while(A.size() > 1){
            B.push(A.pop());
        }
        int result = A.pop();
        while(B.size() > 0){
            A.push(B.pop());
        }
        return result;
    }
    
    public int peek() {
        while(A.size() > 0){
            B.push(A.pop());
        }
        int result = B.peek();
        while(B.size() > 0){
            A.push(B.pop());
        }
        return result;
    }
    
    public boolean empty() {
        return A.isEmpty();
    }
}

结语

  • 队列在数据结构中相对来说是比较简单的,因为只有三个操作,用数组和链表模拟实现下自己的队列,就能很好的掌握队列的用法
  • 下篇数据结构博客会解析二叉树,二叉树的知识点相对来说就比较繁杂,大量题目依赖递归,也涉及到一些算法思想,预计会用5篇博客来解析二叉树,欢迎铁汁们来观看后续的二叉树博客🐵



以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

Geant4学习一:写一个简单程序 1、 基本介绍 阅读详情

相关推荐

发那科机器人编程软件fanuc roboguide授权补丁_工业机器人离线编程与应用:ROBOGUIDE V8.3版本的工程文件创建...

欢迎关注我们ROBOGUIDE是发那科机器人公司提供的一个离线编程工具,可模拟现实中的机器人和周边设备的布局,通过虚拟TP示教来模拟机器人的运动轨迹,同时可以验证方案的可行性和准确的周期时间。ROBOGUIDE是一款核心应用软件,具体的还包括搬运、弧焊、喷涂等其他模块。以最新的8.3版本为例进行讲解,对于未注册的版本将有30天的免费使用期限。开始菜单击开始菜单中的HandingPRO启动程序,第一...

weixin_39791446的博客 2924

用链表模拟实现队列(FIFO)

你还不会循环队列吗.赶快来看看吧

m0_64770095的博客 4246

将ue4程序嵌入qt界面显示

需求:将ue4程序嵌入qt界面显示 思路:通过使用 windowsAPI 对ue4窗口进行设置跟随qt界面以及活动窗口时的位置层序设置

weixin_44342705的博客 5844

模拟实现单链表、双链表、栈、队列——数组模拟

数组模拟实现单链表、双链表、栈、队列,详解加代码,还有例题,帮助理解到位。我们在数据结构中都学到过单链表、双链表、栈和队列,当我们实现的时候时使用结构体指针实现的。定义一个结构体,结构体中存储指针变量和存放数值的变量。当然,C++的STL库中已经有实现好的栈和队列,我们可以直接用。但是在做算法题时,有时候我们会发现超出时间限制。原因是我们用STL库中的栈和队列容器时,效率相对来说较慢。我们这时就引出用数组模拟实现栈和队列。用数组模拟实现的使用起来效率更高、更方便。当然,我们也会讲到用数组模拟实现单链表和双链

weixin_67596609的博客 845

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7279

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 143

【数据结构】栈和队列(链表模拟队列)

【适合会C语言选手】【含 gif 动图思路演示】单链表模拟队列:实现 入队push、出队pop、判空empty、队头元素front、队尾元素back 等功能函数、最后精选题【队列实现栈、 栈实现队列 的 LeetCode题:含 gif 动图思路演示】

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 1408

VSCode + Clangd 配置避坑实录:从‘红波浪线’到完美代码提示的完整心路

本文详细记录了VSCode与Clangd配置过程中的常见问题及解决方案,从编译数据库生成到参数调优,帮助C++开发者快速解决代码提示失效、头文件找不到等问题,实现完美代码补全体验。重点介绍了Clangd与LLDB的集成配置及性能优化技巧,适用于Linux和跨平台开发环境。

weixin_28829479的博客 490

数组和链表的区别、ArrayList和LinkedList的区别、使用LinkedList模拟栈和队列

介绍了数组和链表的区别,ArrayList和LinkedList的区别以及使用LinkedList模拟栈和队列。

终生学习践行者 4311

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 740

PostgreSQL:十五. 性能优化

十五. 性能优化 优化简介: PostgreSQL优化一方面是找出系统的瓶颈,提高PostgreSQL数据库整体的性能; 另一方面,需要合理的结构设计和参数调整,以提高用户操作响应的速度; 同时还要尽可能的节省系统资源,以便系统可以提供更大负荷的服务。 PostgreSQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如: 通过优化文件系统,提高磁盘IO的读写速度; 通过优化操作系统调度策略,提高PostgreSQL的在高负荷情况下负载能力; 优化表结构、索引、查询

数据知道的博客 4万+

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 326

基于毫米波生物感知雷达+STM32设计的独居老人居家监护系统(微信小程序)(192)

当前基于STM32设计的独居老人居家监护系统为独居老人提供一种简便、实时的健康监护服务。该系统通过集成多种传感器和功能模块,能够实时监测老人的生理指标、姿态以及室内环境状况,并通过微信小程序远程显示数据,当出现异常情况时及时发出报警提醒。

1万+

pandas 深度入门:从数据结构到一份真实销售报表

本文系统讲解Pandas核心应用,从三分钟安装到完整月度报表生成,涵盖数据读取、清洗、筛选、分组聚合、表连接、透视表与时间序列等13个关键环节。强调“先看数据再动手”,掌握Series/DataFrame/Index结构本质,熟练运用loc/iloc、merge校验、agg/transform区别,通过真实案例实现高效报表自动化,告别手动Excel操作。最后提供性能优化与高频报错解决方案,助力读者快速上手,真正实现“写二十行代码,跑三秒出结果”。

信息安全领域优质创作者|操作系统领域专家 264

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

工单系统的数据结构化:故障分类体系设计与报表可用性

很多团队上完工单系统半年,会发现一个尴尬的事实:单子照常在走,报表却始终出不来。导出的 Excel 几千行,看不出趋势、算不出口径、答不了"哪类故障占大头"。问题几乎都不在系统,而在数据模型的第一层——。这篇文章把这件事拆开讲:自由文本为什么会失效、分类体系怎么分层、表怎么建、老数据怎么迁、上线前怎么验收。

ITyunwei0987的博客 277

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构:9.Map和Set

有的讲解会说这里key是标识作用,这种说法其实没有太大意义,就算知道了他是标识value的作用又如何,在实际的使用过程中,我们只会根据具体的效果选择使用的方法等,不会执着于“标识”这种说法。2.由于哈希函数的设计原则太过理论,它仅仅是在认为:这些通过关键码算出来的index不同 的情况下设计的,然而这种理论化的设计原则在遇到冲突时,恰恰就出现了问题,而我们能做的,就是降低冲突率。虽然哈希表的使用过程中存在冲突,但是在实际的使用过程中,哈希表的冲突率是不高的,冲突的个数是可控的。

2602_95646088的博客 191

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[C++高阶数据结构·图论下] 最短路径:为什么“挑最小的”一定正确?

本文系统对比最小生成树与最短路径的核心差异,聚焦三类最短路算法:Dijkstra(非负权、贪心确认)、Bellman-Ford(可负权、反复松弛)、Floyd(全源、分层中转)。核心区别在于:MST 关注“连通所有点”的最小代价(边数固定),而最短路关注“两点间路径最短”(边数可变)。关键反直觉点是:负权对 MST 无害,却使 Dijkstra 失效——因“绕远更近”破坏贪心前提。算法本质反映三种处理不确定性的策略:确认式(Dijkstra)、迭代修正(Bellman-Ford)、分层逼近(Floyd)。强

Tairitsu_青云 510

[C++高阶数据结构·图论上] 最小生成树:为什么“选边”和“选点”是两条路?

本文系统讲解最小生成树(MST)的核心思想与两大算法:Kruskal与Prim。强调MST目标是用最小权值总和连接所有顶点形成一棵树,而非单边最小。通过三条构造准则(用图中边、恰n-1条边、无环)统一框架。Kruskal按边贪心,依赖并查集判环,适合稀疏图;Prim按点扩张,利用割集特性天然避免成环,需起点,适合稠密图。两算法本质差异在于“判环”机制与数据结构选择,且与最短路径问题在连通性、负权处理上截然相反,需分篇厘清。

Tairitsu_青云 219

Vue3 低代码移动表单设计器实战(二):缩放画布下的拖拽系统与树状级联数据结构

本文深入剖析Vue3低代码表单设计器在缩放画布下的拖拽失效问题,揭示SortableJS在CSS Transform下坐标崩溃的数学根源。通过自研独立视觉克隆壳层与逆向几何补偿算法,实现精准拖拽;采用扁平数据存储+运行时树状计算结构,解决级联依赖与深克隆难题,确保逻辑一致性与性能优化,为复杂低代码系统提供可复用的工程范式。

NanChen的博客 337

排序算法深度笔记(上):比较类排序的思想演进与代码实现

与。本文聚焦前者 —— 也就是通过元素间两两比较来确定相对顺序的排序算法,从最朴素的 O (n²) 基础排序,到工业级主流的 O (nlogn) 进阶排序,逐层拆解设计思想、带注释的代码实现与边界细节。当我们理解了比较排序的性能边界,也就自然引出了非比较排序的存在意义。所有代码均遵循统一的实现规范:入口函数前置空数组与单元素边界校验,基于数组原地修改,主函数附带可直接运行的测试用例,与练习代码风格完全对齐。

2401_87069538的博客 606

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 80

数据结构:双向链表实现,链表与顺序表的对比

本节讲解数据结构双向链表,链表和顺序表的特点对比,顺便解释了一下什么是CPU缓存和内存碎片

lei_jiale的博客 369

【数据结构】树和二叉树(下):讲透四种遍历、递归返回值与经典题

🔥 星光编译者📚 学习专栏:《C/C++ 成长笔记》《Linux 实践手册》《数据结构与算法》🌄 向云端飞扬,编译属于自己的代码星河。☕ 写在开篇你好,这里是星光编译者。这里记录我在C/C++、Linux、数据结构与算法学习中遇到的真实问题、亲手验证过的代码,以及那些容易被忽略的实现细节。比起简单罗列结论,我更愿意从问题出发,把一个知识点的来由讲清楚,把“为什么会这样”和“应该怎样解决”说明白,让每一次踩坑都沉淀成可以复用的经验。如果这篇记录能帮你少绕一点路。

星光编译者的技术博客,专注 C/C++、Linux、数据结构与算法。 391

【数据结构-2】顺序表的实现

线性表是一种数据结构,它分为逻辑结构和物理结构,在逻辑结构上线性表是呈线性的,数据是是连续存储的;在物理结构(物理空间)上,线性表不一定是连续存储的。线性表的实现,主要分为数组和链式结构。顺序表是线性表的一种实现方式,顺序表在逻辑结构和物理结构上都是连续的。顺序表的底层实现是数组。

weixin_44218929的博客 207

数据结构—B树

一棵m(m>2)阶的B树,是一棵平衡的M路平衡树,可以说空树或满足以下6点。1.根节点至少有两个孩子2.每个分支节点都包含k-1个关键字和k个孩子,ceil(m/2)<=k<=m;孩子比关键字多一个ceil向上取整3.每个叶子节点都包含k-1个关键字,ceil(m/2)<=k<=m;4.所有的叶子节点在同一层。5.每个节点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含元素的值域划分。6.节点的结构是{n,A0,K1,A1,K2,........Kn,An};

fish_xk的博客 128

数据结构(2)

不同点顺序表链表(单链表)存储空间上物理上一定连续逻辑上连续,但物理上不一定连续随机访问支持:O(1)不支持:O(N)任意位置插入或删除元素可能需要搬移元素,效率低 O(N)只需修改指针指向插入动态顺序表,空间不够时需要扩容和空间浪费没有容量的概念,按需申请释放,不存在空间浪费应用场景元素高效存储 + 频繁访问任意位置高效插入和删除。

likexuec的博客 146
上一篇: 栈的使用、模拟实现、相关经典算法题详细解析
下一篇: 二叉树(一)树结构基础,先序、中序、后序遍历代码,规律详细解析,看完包懂!
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值