【数据结构】励志大厂版·初阶(复习+刷题):栈与队列
前引:本篇将由小编与大家一起复习 栈 、队列 的知识点,栈、队列的顺序、链式结构各个缺点好处,如何实现、对于一般的增删查找此篇文章一定再详细不过!对代码的注释、何时需要判断、特殊情况,白话文版一解到底,彻底了解栈与队列。文章末尾还精心选择了几道例题,小编同样会精心讲解,如果伙伴们被感动了的话!可否一键三连~好了,正文开始~
目录
知识点速览
栈
栈的存储结构分析
栈的基本操作
结构体定义
初始化栈
判断栈空
入栈
读取栈元素
出栈
销毁栈
队列
队列的结构分析
队列的基本操作
结构体定义
初始化队列
入队列
出队列
获取队尾元素
获取队头元素
判断队空
销毁队列
栈和队列OJ题(典型)
知识点速览
栈
何为栈?栈是一种线性结构,只允许在一端进行插入和拿出元素的数据结构。
压栈(也叫入栈):插入元素
出栈:拿出元素
栈顶:进行插入和拿出元素的一端
栈底:固定的,不允许进行插入和拿出元素
存储特点:先进后出、后入先出。想象成一个一端开口的容器!
栈的存储结构分析
首先栈可以用两种结构来实现,一种是顺序栈,也就是用数组实现;另一种是链式栈,用链表实现。这两种结构栈我们应该选择哪一种来实现好?综合考虑,我们优先选择顺序栈
首先是顺序栈:
顺序栈出栈、入栈都很方便,栈顶指针也方便指向,有一个小缺点:扩容可能导致空间浪费
其次是链式栈:
链式栈虽然扩容很方便,无浪费情况,但是出栈时,不好控制栈顶指针, 设置稍微复杂一点。比如单链表,需要将链表倒置过来,否则栈的存储特定就与其不符,出栈时需要知道倒数第二个链表节点。还有双链表结构,虽然不用去找倒数第二个节点,但是写起来没有那么的简单、快捷
栈的基本操作
初始化栈 判断栈空 入栈 读取栈元素 出栈 销毁栈
结构体定义
顺序栈只需要一个栈顶指针、一个空间指针即可。在初始化时给空间指针开辟空间,这里小编建议可以额外设置一个空间上限,方便以后扩容
typedef struct Olderstack
{//栈顶指针int top;//存储空间指针int* data;//存储上限int max;
}Olderstack;
初始化栈
栈的初始状态应该是栈顶指针在栈底的位置,再给栈开辟空间
//初始化栈
void preliminary(Olderstack* Stack)
{//初始化栈顶指针、空间上限Stack->max = MAX;Stack->top = 0;//开辟存储空间Stack->data = (int*)malloc(sizeof(int) * MAX);//判断空间有效性if (Stack->data == NULL){printf("开辟失败\n");return;}//(可以反馈一下)printf("空间开辟成功\n");
}
判断栈空
栈空的标志就是栈顶指针指向栈底。这里直接根据栈顶指针指向来判。这里解释一下为何判断选择传址?因为我们后面在打印栈元素、出栈的时候需要用到判断,为了接口的一致选择传址,同时防止代码被修改,可以用 const 修饰
//判断栈空
void Judgment(const Olderstack* Stack)
{//直接判断栈顶指针if (Stack->top == 0){printf("栈为空\n");return;}
}
入栈
顺序栈的入栈就像将元素存进数组一样,只是需要控制栈顶指针的更新,考虑栈满需要扩容的情况
//入栈
void Enter(Olderstack* Stack, int data)
{//先判断存储空间是否已满if (Stack->top == Stack->max){//已满需要扩容int* pc = (int*)realloc(Stack->data, sizeof(int) * (Stack->max) * 2);//判断空间有效性if (pc == NULL){printf("扩容失败\n");return;}Stack->data = pc;//更新空间上限Stack->max *= 2;}//更新栈顶指针Stack->top++;//入栈Stack->data[Stack->top - 1] = data;printf("入栈成功\n");
}
读取栈元素
因为栈的存储特性,我们只能读取栈顶元素,同时读取栈元素并不会改变栈顶指针,需要额外一个变量去代替栈顶指针的移动来不断读取栈顶元素。这里需要判断栈空,为了与前面的接口适用,我们选择取地址,同时注意加 const 修饰,防止误触!注意:前置减减 后置减减的区别
//读取栈元素
void Read(const Olderstack* Stack)
{//判断栈空Judgment(Stack);//设置变量代替栈顶指针int size = Stack->top;//读取栈元素printf("栈元素:");while (size){printf("%d ", Stack->data[--size]);}
}
下面我们通过不断入栈来试一下打印效果,注意栈的存储特点:先进后出
出栈
出栈按照理论逻辑:栈顶指针每次指向靠近栈顶元素的末尾,因此最好先出栈,再改变栈顶指针
注意:前置减减、后置减减的区别 【前置是先减再使用,后置是先使用再减减】
//出栈
void Out(Olderstack* Stack)
{//判断栈空Judgment(Stack);//出栈顶元素Stack->data[--Stack->top];printf("出栈成功\n");}
销毁栈
按照逻辑,我们先清理栈空间存储的数据,再释放栈。下面我们释放之后再来测试一下:
//销毁栈
void Undermine(Olderstack* Stack)
{//出栈存储的元素while (Stack->top){Out(Stack);}//释放栈存储空间free(Stack->data);Stack->data = NULL;printf("栈空间释放成功\n");
}
队列
队列也是一种线性数据结构,允许在一端存入数据、一端拿出数据
队头:允许拿出(删除)数据的一端,也称队首
队尾:允许存入数据的一端
结构特点:拥有两个指针指向队头与队尾的元素,随着元素的变化发生改变
存储特点:先进先出
队列的结构分析
队列的实现也可以选择顺序结构、链式结构,但是总体考虑,以链式结构最佳
首先是队列的顺序结构:
我们知道顺序结构移除某个元素是很方便的,但是队列有两个指针分别随着元素的变化发生改变,这导致出现了以下的情况:随着元素逐渐出去,队头指针head会不断移动,当不断地进数据出数据会导致空间浪费越来越大
其次是链式结构:
队列更好的实现方式是链式结构,因为较于顺序结构,虽然是采用节点来存储数据,但是它的出队列、入队列就是链表的头删、尾插,使用起来比顺序结构更效率,且没有空间的浪费,如下图
队列的基本操作
初始化队列 入队 出队 获取队尾元素 获取队头元素 判断对空 销毁队列
结构体定义
首先咱们采用的是链表来定义的,因此肯定需要一个链表结构、其次需要两个指针指向队尾队头的元素,为了不与链表发生混乱,我们将这两个指针单独放在一个结构体里面。
注意:队列指针的类型应该是链表类型的,因为它是指向链表的,后面通过队列指针来维护节点
//链表节点
typedef struct List
{struct List* next;int data;
}List;
//队列空间
typedef struct Queqe
{struct List* head;struct List* real;//当前队列元素个数int size;
}Queqe;
初始化队列
重点:咱们的初始化不是先初始化一个链表开辟头指针,而是开辟队列空间,在入队列的时候再开辟链表节点
//初始化队列
Queqe* preliminary()
{//开辟队列空间Queqe* Space = (Queqe*)malloc(sizeof(Queqe));//判断空间有效性if (Space == NULL){printf("队列空间开辟失败\n");return NULL;}//初始化队列成员Space->head = NULL;Space->real = NULL;Space->size = 0;printf("队列空间开辟成功\n");return Space;
}
入队列
重点:咱们得数据是放在链表里面的,所以应该先开辟一个链表节点用来放数据,然后队列指针指向之前需要判断,如果这是第一个存入的数据,那么队列指针指向这个节点;如果是第 N 个数据,那么就需要通过链表节点的 next 指针来进行连接节点
如何通过队列空间来找到链表节点存储数据?
因为队列指针类型是链表类型,通过队列指针找链表
例如:Space->real->next=newnode Space->real=newnode
为何队列空间的判断最好用元素个数?
这里存储的时候根据队列指针是否为空也可进行判断,因为链表末尾为空,队列指针如果为空,则表示指到了链表的末尾,没有节点。但是直观上根据元素个数判断更加直观,没有难度
//入队列
void Enter(Queqe** Space, int data)
{//开辟节点空间List* newnode = (int*)malloc(sizeof(List));//判断空间有效性if (newnode == NULL){printf("节点空间开辟失败\n");return;}//设置链表空间newnode->data = data;newnode->next = NULL;//如果是第一个元素if ((*Space)->size == 0){(*Space)->real = newnode;(*Space)->head = newnode;(*Space)->size++;}else{//连接节点(*Space)->real->next = newnode;//改变队列指针(*Space)->real = newnode;(*Space)->size++;}printf("入队成功\n");
}
出队列
先判断是否有元素可以出队,如果有则释放该链表节点后,再改变队列指针指向
//出队列
void Out(Queqe** Space)
{//判断队列是否为空if ((*Space)->size == 0){printf("队列为空,无法出队\n");return;}//释放对应的链表节点List* cur = (*Space)->head;//改变队列指针指向(*Space)->head = (*Space)->head->next;free(cur);cur = NULL;//队列元素个数减减(*Space)->size--;printf("出队成功\n");
}
获取队尾元素
先判断队列是否为空,否则直接打印对应队尾指针指向节点的元素即可
//获取队尾元素
void Tail_team(Queqe* Space)
{//如果队列元素为空if (Space->size == 0){printf("队列为空,无法获取\n");return;}List* cur = Space->real;printf("队尾元素:%d\n", cur->data);
}
获取队头元素
先判断队列是否为空,然后打印对应队列指针所指向节点的元素
//获取队头元素
void Head_team(Queqe* Space)
{//如果队列元素为空if (Space->size == 0){printf("队列为空,无法获取\n");return;}printf("队尾元素:%d\n", Space->head->data);
}
判断队空
这里咱们就不多说了,前面咱们一直都有这个判断,这里只是单独封装成一个函数
//判断队空
void Empty_team(Queqe* Space)
{//如果队列元素为空if (Space->size == 0){printf("队列为空\n");return;}
}
销毁队列
咱们的队列是由链表完成的,应该先释放链表,再释放队列空间,否则就找不到链表位置了
注意:队列里链表应该由队头销向队尾,因为链表的尾部在队尾这端,下面小编进行了详细注释
同时注意二级指针指向的是一级指针的地址,对二级指针解引用一次,就拿到一级指针地址
例如:
//销毁队列
void Undermine(Queqe** Space)
{//如果队列元素为空if ((*Space)->size == 0){printf("队列为空,无法销毁\n");return;}//销毁链表List* cur = (*Space)->head;while ( (*Space)->head ){(*Space)->head = (*Space)->head->next;//释放链表节点free(cur);cur = NULL;//重新指向下一个节点cur = (*Space)->head;}//销毁队列空间free(*Space);*Space = NULL;printf("销毁成功\n");
}
栈和队列OJ题(典型)
题目分析:
有一个字符数组,里面的内容是几个括号,根据数组内容判断括号是否是完整对应来返回不同的值。这里就是根据字符的位数来判断对应位置的字符与其是否相匹配的问题
实例讲解:
比如现在有一个字符串“ ()”
先建立一个堆,第一个字符是左括号“(”入栈,下一次进入循环的字符是“)”,则出栈顶元素与其进行匹配,此时匹配成功,再次进入循环遇到循环结束条件,最后栈也为空,返回 true
比如现在有一个字符串“)[”
先建立一个堆,此时第一个字符是右括号“)”,选择出栈,但是栈为空,则直接返回 false
思维讲解:
我们可以建议一个堆,如果当前字符是“(”“{”“[”,就存入堆里面,如果是“)”“}”“]”就将堆顶的元素拿出来与之对比,如果匹配成功,就继续,直到数组内容到达“\0”,否则返回 false,听到这里肯定还不是很清楚,没事(小编当时也是这样的!哈哈!下面有画图演示,千万别担心!)大家接着往下看,跟着思路走,整体就疏通了!我们主要是通过堆的存储与取出堆顶元素来实现这道题!
(1)先实现\拷贝对应的堆功能过来,这题需要初始化堆、入堆、出堆顶元素、判断栈空、销毁堆
注意:改变相应存储的元素、空间指针类型为 char 类型
这个判断栈空的函数我们可以简写,直接判断栈的元素个数,这对新手小白很友好
下面是将之前实现堆的函数直接拷贝过来!注意判断栈空的函数小编直接简写了哦
#define MAX 10typedef char Datatype;typedef struct Olderstack
{//栈顶指针int top;//空间上限int max;//存储空间指针Datatype* data;
}Olderstack;//初始化栈
void preliminary(Olderstack* Stack)
{//初始化栈顶指针、空间上限Stack->max = MAX;Stack->top = 0;//开辟存储空间Stack->data = (Datatype*)malloc(sizeof(Datatype) * MAX);//判断空间有效性if(Stack->data==NULL){return;}
}//入栈
void Enter(Olderstack* Stack, Datatype data)
{//先判断存储空间是否已满if (Stack->top == Stack->max){//已满需要扩容Datatype* pc = (Datatype*)realloc(Stack->data, sizeof(Datatype) * (Stack->max) * 2);//判断空间有效性if (pc == NULL){return;}Stack->data = pc;//更新空间上限Stack->max *= 2;}//更新栈顶指针Stack->top++;//入栈Stack->data[Stack->top - 1] = data;
}//出栈
char Out(Olderstack* Stack)
{//出栈顶元素return Stack->data[--Stack->top];
}//销毁栈
void Undermine(Olderstack* Stack)
{//出栈存储的元素while (Stack->top){Out(Stack);}//释放栈存储空间free(Stack->data);Stack->data = NULL;
}
(2)其次我们创建一个栈,再初始化(因为此题是利用栈完成的)
//创建栈Olderstack Stack;//初始化栈preliminary(&Stack);
(3)进入循环判断,直到遇到 \0 退出循环
如果是左括号就入栈,然后字符指针后移一位
如果是右括号就先判断是不是栈空,否则出栈拿栈顶元素与与其匹配,不匹配则返回
while(*s){//如果是前括号就入栈if(*s=='(' || *s=='[' || *s=='{'){Enter(&Stack, *s);s++;}else{//如果直接是右括号且栈为空就判错if(Stack.top==0){//销毁栈Undermine(&Stack);return false;}//否则出栈,与当前的元素进行匹配Datatype cur = Out(&Stack);//如果不匹配直接返回,否则继续if(cur=='(' && *s!=')' || cur=='{' && *s!='}' || cur=='[' && *s!=']' ){//销毁栈Undermine(&Stack);return false;}else{s++;}} }
(4)如果经过了上面的循环判断,也就是没有返回 false ,可能是下面这种情况:
存在匹配成功的部分,但是字符串走到 \0 了,比如:“()[” 或者“{”栈不为空,返回 false
//判断空栈bool result=(Stack.top==0);//此时数组判断完,全部符合条件,先销毁栈再返回Undermine(&Stack);return result;
测试用例是不用判断数组没有元素的情况的,也就是说至少一个括号,如图:
相关文章:
【数据结构】励志大厂版·初阶(复习+刷题):栈与队列
前引:本篇将由小编与大家一起复习 栈 、队列 的知识点,栈、队列的顺序、链式结构各个缺点好处,如何实现、对于一般的增删查找此篇文章一定再详细不过!对代码的注释、何时需要判断、特殊情况,白话文版一解到底ÿ…...
pytest——参数化
之前有说过,通过pytest测试框架标记参数化功能可以实现数据驱动测试。数据驱动测试使用的文件主要有以下类型: txt 文件 csv 文件excel 文件json 文件yaml 文件.... 本文主要讲的就是以上几种文件类型的读取和使用 一.txt 文件读取使用 首先创建一个 …...
第7篇:RESTful API设计与安全防护
在前后端分离架构中,RESTful API是系统交互的核心通道。本文将从接口规范设计到安全防护,全面讲解如何在EggJS中构建安全、规范、易用的API系统,并提供完整的解决方案和最佳实践。 一、标准化API接口规范设计 1. RESTful设计原则 核心要素&…...
CSS 架构与命名规范
CSS 架构与命名规范:BEM、SMACSS 与 OOCSS 实战 引言 在前端开发中,随着项目规模的扩大,CSS 代码往往会变得难以维护和扩展。无组织的样式表会导致命名冲突、权重覆盖问题和样式继承混乱,这些问题在团队协作的大型项目中尤为明显…...
实验二 软件白盒测试
实验二 软件白盒测试 某工资计算程序功能如下:若雇员月工作小时超过40小时,则超过部分按原小时工资的1.5倍的加班工资来计算。若雇员月工作小时超过50小时,则超过50的部分按原小时工资的3倍的加班工资来计算,而40到50小时的工资仍…...
【数据结构】String字符串的存储
目录 一、存储结构 1.字符串常量池 2.字符串哈希表 2.1结构 2.2基础存储单位 2.2.1键对象 2.2.2值对象 二、存储过程 1.搜索 2.创建 三、存储位置 四、存储操作 1.new新建 2.intern入池 这是String类的详解:String类变量 一、存储结构 1.字符串常量池…...
LLMs Tokenizer Byte-Pair Encoding(BPE)
1 Byte-Pair Encoding(BPE) 如何构建词典? 准备足够的训练语料;以及期望的词表大小;将单词拆分为字符粒度(字粒度),并在末尾添加后缀“”,统计单词频率合并方式:统计每一个连续/相邻字节对的出现频率,将最高频的连续字…...
npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令
前端比较主流的包管理器主要有三个npm,yarn,pnpm 多层级依赖,通常发生在依赖之间存在复杂的版本要求时 包 A 依赖于包 B1.0.0 包 B 依赖于包 C2.0.0 另一个包 D 也依赖于 C3.0.0 一、NPM (Node Package Manager) https://www.npmjs.cn/…...
使用mybatis实例类和MySQL表的字段不一致怎么办
在 MyBatis 中,当 Java 实体类的属性名与数据库表的字段名不一致时,会导致查询结果无法正确映射。以下是几种常见解决方案及代码示例: 1. 使用 resultMap 显式映射(推荐) 场景:字段名与属性名差异较大&…...
阿里发布新一代通义千问 Qwen3模型
近日,阿里巴巴发布了新一代通义千问 Qwen3 模型,一举登顶全球最强开源模型。 这是国内首个“混合推理模型”,将“快思考”与“慢思考”集成进同一个模型,大大节省算力消耗。 旗舰模型 Qwen3-235B-A22B 在代码、数学、通用能力等…...
React pros比较机制
将 count1作为prop传递给Memoson组件 引用类型情况 虽然list值没有发生变化,但是仍旧重新渲染 解决方法使用useMemo()函数,传递一个空依赖项 // 传递数据为引用类型 比较的是引用 // 使用useMemo函数改写、const list useMemo(()>{return [1,2,3]},[…...
Flowable7.x学习笔记(十七)审批我的待办
前言 前文完成了我的待办的查询功能,本文就在此基础上从源码解读到完成审批任务的功能,审批界面我就先不带表单,直接单纯审批通过,这里需要注意的事,审批的表单其实每个节点都可能需要不同的表单内容,后续要…...
HTTP 状态码详解:用途与含义
HTTP 状态码详解:用途与含义 HTTP 状态码详解:用途与含义1. (2xx)成功类200 OK201 Created204 No Content206 Partial Content 2. (3xx)重定向类301 Moved Permanently302 Found(临时重定向&…...
AI日报 · 2025年05月02日 | 再见GPT-4!OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除
1、OpenAI CEO 确认 GPT-4 已从 ChatGPT 界面正式移除 在处理 GPT-4o 更新问题的同时,OpenAI CEO Sam Altman 于 5 月 1 日在 X 平台发文,正式确认初代 GPT-4 模型已从 ChatGPT 主用户界面中移除。此举遵循了 OpenAI 此前公布的计划,即在 4 …...
ppt设计美化公司_杰青_长江学者_优青_青年长江学者_万人计划青年拔尖人才答辩ppt模板
WordinPPT / 持续为双一流高校、科研院所、企业等提供PPT制作系统服务。 / 近期PPT美化案例 - 院士增选、科学技术奖、杰青、长江学者特聘教授、校企联聘长江、重点研发、优青、青长、青拔.. 杰青(杰出青年科学基金) 支持已取得突出成果的45岁以下学…...
文章四《深度学习核心概念与框架入门》
文章4:深度学习核心概念与框架入门——从大脑神经元到手写数字识别的奇幻之旅 引言:给大脑装个"GPU加速器"? 想象一下,你的大脑如果能像智能手机的GPU一样快速处理信息会怎样?这正是深度学习的终极目标&…...
HTML5+JavaScript实现连连看游戏之二
HTML5JavaScript实现连连看游戏之二 以前一篇,见 https://blog.csdn.net/cnds123/article/details/144220548 连连看游戏连接规则: 只能连接相同图案(或图标、字符)的方块。 连线路径必须是由直线段组成的,最多可以有…...
2025年- H19-Lc127-48.旋转矩阵(矩阵)---java版
1.题目描述 2.思路 画出矩阵,新的旋转矩阵的列坐标等于原始矩阵的矩阵长度-i-1(也就是减去当前遍历的i),前后对调。然后新的旋转矩阵的横坐标,是原始矩阵的列坐标。 3.代码实现 public class H48 {public void rota…...
深入理解 MyBatis 代理机制
在 Java 开发领域,MyBatis 是一款优秀的持久层框架,它极大地简化了数据库操作,提高了开发效率。其中,代理机制作为 MyBatis 的核心特性之一,在连接 Java 代码与数据库操作中发挥着关键作用。本文将深入探讨 MyBatis 代…...
游戏引擎学习第254天:重新启用性能分析
运行游戏并尝试让性能分析系统恢复部分功能 我们现在的调试系统这几天基本整理得差不多了,因此我们打算开始清理一些功能,比如目前虽然已经在收集性能分析数据,但我们没有办法查看或有效利用这些信息。今天的计划可能会围绕这方面展开&#…...
性能测试工具篇
文章目录 目录1. JMeter介绍1.1 安装JMeter1.2 打开JMeter1.3 JMeter基础配置1.4 JMeter基本使用流程1.5 JMeter元件作用域和执行顺序 2. 重点组件2.1 线程组2.2 HTTP取样器2.3 查看结果树2.4 HTTP请求默认值2.5 JSON提取器2.6 用户定义的变量2.7 JSON断言2.8 同步定时器&#…...
【Hive入门】Hive性能调优之Join优化:深入解析MapJoin与Sort-Merge Join策略
目录 前言 1 Hive Join操作基础 1.1 Join操作的类型与挑战 1.2 Hive Join执行机制 2 MapJoin优化策略 2.1 MapJoin原理 2.2 MapJoin适用场景 2.3 MapJoin关键参数 3 Sort-Merge Join优化策略 3.1 Sort-Merge Join原理 3.2 Sort-Merge Join优势 3.3 关键配置参数 3…...
【Unity】使用XLua实现C#访问Lua文件
先引入XLua文件中的Plugins和XLua文件夹于Unity项目的Asset文件中 XLua_github链接 建立Lua虚拟机:LuaEnv luaEnv new LuaEnv(); 关闭虚拟机,及时释放资源:luaEnv.Dispose(); Resources文件夹下加载lua文件(假设文件路径为Resour…...
AXI中的out of order和interleaving的定义和两者的差别?
AXI中的out of order和interleaving的定义和两者的差别 摘要:在 AXI (Advanced eXtensible Interface) 协议中,Out-of-Order 和 Interleaving 是两个与事务处理顺序和数据传输相关的概念,它们都与 AXI 协议支持的多事务并发处理能力有关&…...
生产级RAG系统一些经验总结
本文将探讨如何使用最新技术构建生产级检索增强生成(RAG)系统,包括健壮的架构、向量数据库(Faiss、Pinecone、Weaviate)、框架(LangChain、LlamaIndex)、混合搜索、重排序器、流式数据接入、评估策略以及实际部署技巧。 引言:检索增强生成的力量 大型语…...
sftp连接报错Received message too long 168449893
sftp连接报错Received message too long 168449893 一、openEuler传文件报错二、分析问题三、解决问题endl 一、openEuler传文件报错 [rootRocky9-12 ~]# scp apache-tomcat-10.1.33.tar.gz root10.0.0.14:Authorized users only. All activities may be monitored and report…...
Java中修饰类的关键字
Java中修饰类的关键字 在web编程课上,老师提问了Java中各种修饰类的关键字的用途和区别,一时间我头脑空白,现在课后重新梳理一遍Java中修饰类的各种关键字的区别和用法。在Java编程中,修饰类的关键字起着至关重要的作用ÿ…...
2025年人工智能火爆技术总结
2025年人工智能火爆技术总结: 生成式人工智能 生成式人工智能可生成高质量的图像、视频、音频和文本等多种内容。如昆仑万维的SkyReels-V2能生成无限时长电影,其基于扩散强迫框架,结合多模态大语言模型和强化学习等技术,在运动动…...
脑机接口技术:开启人类与机器的全新交互时代
在科技飞速发展的今天,人类与机器的交互方式正经历着前所未有的变革。从最初的键盘鼠标,到触摸屏,再到语音控制,每一次交互方式的升级都极大地提升了用户体验和效率。如今,脑机接口(Brain-Computer Interfa…...
Arduino程序函数详解与实际案例
一、Arduino程序的核心架构与函数解析 Arduino程序的核心由两个函数构成:setup() 和 loop()。这两个函数是所有Arduino代码的骨架,它们的合理使用决定了程序的结构和功能。 1.1 setup() 函数:初始化阶段 setup() 函数在程序启动时仅执行一次,用于完成初始化配置,例如设置…...
2025年RAG技术发展现状分析
2025年,大模型RAG(检索增强生成)技术经历了快速迭代与深度应用,逐渐从技术探索走向行业落地,同时也面临安全性和实用性的新挑战。以下是其发展现状的综合分析: 一、技术架构的持续演进 从单一到模块化架构 …...
C++11新特性_范围-based for 循环
based for 循环介绍 范围 - based for 循环(Range-based for loop)是 C11 引入的一种新的 for 循环语法,它可以更简洁地遍历容器和数组。 遍历数组:定义了一个整数数组 arr,使用范围 - based for 循环 for (int num :…...
小牛电动:荣登央视舞台,引领智能出行新潮流
在这个科技飞速发展的时代,出行方式也在不断地变革与创新。而在两轮电动车领域,有一个品牌凭借其卓越的技术、独特的设计和优质的服务脱颖而出,那就是小牛电动。近日,小牛电动荣登央视舞台,成为备受瞩目的焦点…...
Three.js在vue中的使用(一)-基础
Three.js 是一个基于 WebGL 的 JavaScript 3D 图形库,它简化了在网页中创建和渲染 3D 场景的复杂性。Three.js 提供了丰富的功能,如光照、材质、几何体、动画、控制器等,使得开发者可以快速构建交互式的 3D 应用。 🧠 Three.js 原理概述 1. WebGL 基础 Three.js 底层使用…...
开发板型号 ESP32-DevKitC-32模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3
以下是关于开发板型号 ESP32-DevKitC-32、模块型号 ESP32-WROOM-32 和主控芯片 ESP32-D0WDQ6-V3 的详细介绍: 开发板型号:ESP32-DevKitC-32 概述:ESP32-DevKitC 是乐鑫推出的一款基于 ESP32 模组的小型开发板,板上模组的绝大部…...
【C语言练习】015. 声明和初始化指针
015. 声明和初始化指针 015. 声明和初始化指针1. 声明指针示例1:声明一个指向整数的指针2. 初始化指针示例2:将指针初始化为`NULL`示例3:将指针初始化为某个变量的地址示例4:将指针初始化为动态分配的内存地址3. 使用指针访问和修改变量的值示例5:使用指针访问和修改变量的…...
手撕哈希表
引入:unordered_set /map是什么? 库里面除开set和map,还有unordered_set 和 unordered_map,区别在于: ①:set和map的底层结构是红黑树,而unordered_set和unordered_map的底层是哈希表 ②&…...
编程题python常用技巧-持续
1.字典 1.1排序 在Python中,要按照字典的值进行排序,可以按照以下步骤操作: 方法说明 获取键值对列表:使用 dict.items() 获取字典的键值对视图。排序键值对:使用 sorted() 函数,并通过 key 参…...
大模型蒸馏技术
提问:请写一篇关于蒸馏大模型的详细解说(论文),要求配有图并不少于8000字。 Deepseek: 大模型蒸馏技术:原理、方法与产业实践 ——基于知识压缩与效率优化的深度解析 目录 引言:大模型时代的…...
深入理解C语言中的整形提升与算术转换
深入理解C语言中的整形提升与算术转换 一.整形提升:概念与原理 在C语言中,整形提升(Integer Promotion)是一个重要但容易被忽视的概念。它指的是在表达式中,任何小于int类型的整型(如char、short…...
企业经营系统分类及功能详解
近年来互联网行业下行,招聘少,要求离谱,年龄学历背景已经卡的死死的,技术再突出也没用。 但对于软件开发来说,互联网只是一小部分,企业级系统软件开发,虽然不如互联网大起大落,但重…...
IRF2.0IRF3.1
1、IRF3定义 IRF3是一种能够提高网络接入层的接入能力和管理效率的纵向网络整合虚拟化技术,采用IEEE 802.1BR标准协议实现。IRF3将多台PEX设备(Bridge Port Extender)连接到父设备(Parent device)上,将每台…...
【C++】类和对象【中下】
目录 一、类与对象1、运算符重载1.2 赋值运算符重载1.3 <<运算符和>>运算符1.4 前置与后置 2、 const成员函数3、取地址运算符重载 个人主页<—请点击 C专栏<—请点击 一、类与对象 本期的主题是一步步完善日期类的编写,将要讲解的知识融入在代…...
ThreadLocal详解
什么是 ThreadLocal? ThreadLocal 是 Java 中的一个工具类,用于为每个线程提供独立的变量副本,使得每个线程可以独立操作自己的变量,避免多线程环境下的数据竞争问题。它的核心思想是线程封闭(Thread Confi…...
Vue3 + OpenLayers 企业级应用进阶
1. 企业级架构设计 1.1 微前端架构集成 // src/micro-frontend/map-container.ts import { Map } from ol; import { registerMicroApps, start } from qiankun;export class MapMicroFrontend {private map: Map;private apps: any[];constructor(map: Map) {this.map map;…...
如何提升自我执行力?
提升个人执行力是一个系统性工程,需要从目标管理、习惯养成、心理调节等多方面入手。 以下是具体方法,结合心理学和行为科学原理,帮助你有效提升执行力: 一、明确目标:解决「方向模糊」问题 1. 用SMART原则设定目标 …...
L3-041 影响力
下面给出基于“切比雪夫距离”(Chebyshev 距离)之和的高效 O(nm) 解法。核心思想是把 ∑ u 1 n ∑ v 1 m max ( ∣ u − i ∣ , ∣ v − j ∣ ) \sum_{u1}^n\sum_{v1}^m\max\bigl(|u-i|,|v-j|\bigr) u1∑nv1∑mmax(∣u−i∣,∣v−j∣) 拆成两个…...
【ESP32】st7735s + LVGL使用-------图片显示
【ESP32】st7735s + LVGL使用-------图片显示 1、文件准备2、工程搭建3、代码编写4、应用部分5、函数调用6、显示效果移植部分参考这个博客: 【ESP32】st7735s + LVGL移植 1、文件准备 本次图片放在内部存储,先使用转换工具将要显示的图片转换好。 文件名保存为xx.c,xx这…...
MERGE存储引擎(介绍,操作),FEDERATED存储引擎(介绍,操作),不同存储引擎的特性图
目录 MERGE存储引擎(合并) 介绍 创建表 语法 示例 查看.mrg文件 操作 查询结果 示例 重建逻辑表 FEDERATED存储引擎 结盟 介绍 编辑 应用场景 操作 开启 创建表 对本地表进行数据插入 EXAMPLE存储引擎 不同存储引擎的特性编辑 MERGE存储引擎(合并) 介绍…...
初学者如何学习AI问答应用开发范式
本文是根据本人2年大模型应用开发5年小模型开发经验,对AI问答应用的开发过程进行总结。 技术范式 现在超过80%的AI问答是 提示词 大模型, 然后就是RAG 方案,这两种无疑是主流方案。 1、提示词大模型 适合于本身业务不超过大模型的知识范围…...