数据结构:栈篇
ps: 本文所有图均为博主亲手所画,本文所有代码基于vs2022实现
系列文章目录
数据结构初探: 顺序表
数据结构初探:链表之单链表篇
数据结构初探:链表之双向链表篇
链表特别篇:链表经典算法问题
文章目录
- 系列文章目录
- 前言
- 一.栈的概念及其结构
- 1.1概念
- 1.2结构
- 二.准备工作
- 1.Stack.h:
- 2.Stack.c:
- 3.test.c:
- 三.栈的增删查改的实现
- 1.Stack.h:
- 2.Stack.c:
- 2.1栈的初始化
- 2.2栈的销毁
- 2.3栈的内存检查并扩容
- 2.4栈的压入(压栈)/栈的插入
- 2.5栈的删除(出栈)
- 2.6返回栈的元素数量
- 2.7检查栈是否为空
- 2.8返回栈顶元素
- 2.9完整代码
- 3.test.c
- 四.栈的优缺点
- 优点
- 缺点
- 五.总结
前言
- 在计算机科学的浩瀚宇宙中,数据结构是构建各类程序大厦的基石,而栈,无疑是其中一颗独特且闪耀的明星。或许你在日常编程时常常与它打交道,却未曾深入探究其背后的奥秘;又或许你对它只是略有耳闻,好奇它究竟为何能在算法世界中占据重要地位。今天,就让我们一同踏上探索栈的奇妙之旅,从它独特的后进先出概念,到数组与链表实现下的精妙结构,再到广泛应用场景,全方位剖析栈的魅力与价值,带你解锁栈的全新认知,感受数据结构的迷人之处 。
一.栈的概念及其结构
1.1概念
-
栈是一种运算受限的线性表,只允许在固定的一段进行数据的操作,它按照后进先出(Last In First Out,LIFO)的原则存储数据。形象地说,栈就像一个只有一端开口的容器,比如羽毛球筒。最后放入筒中的羽毛球会最先被取出,而最先放入的羽毛球则最后被取出。
-
在计算机领域,栈有着广泛应用。例如,在编程语言中,函数调用时会使用栈来管理局部变量和返回地址。当一个函数被调用时,其相关的信息(如参数、局部变量等)会被压入栈中,函数执行完毕后,这些信息会从栈中弹出。此外,表达式求值、括号匹配等问题也常借助栈来解决。
1.2结构
栈主要由以下几个部分构成:
-
栈顶指针:栈顶指针用于指示栈顶元素的位置,它是栈操作的关键。通过栈顶指针,我们可以快速访问栈顶元素,执行压栈(将元素放入栈中)和弹栈(从栈中取出元素)操作。当栈为空时,栈顶指针通常指向一个特定的位置(如 -1 或者 NULL,这取决于具体的实现方式)。每次压入新元素,栈顶指针会相应移动以指向新的栈顶元素;每次弹出元素,栈顶指针也会反向移动。
-
栈元素存储区:这是实际存储栈中元素的地方。可以使用数组或者链表来实现这个存储区。
-
数组实现:使用数组实现栈时,数组的一端被视为栈底,另一端为栈顶。这种实现方式简单直观,访问效率高,因为数组的内存地址是连续的,可以通过索引快速定位元素。例如,定义一个整型数组 stack[100] 来存储栈元素,栈顶指针 top 用于指示栈顶元素的下标。当 top 为 -1 时,表示栈为空;当要压入元素 x 时,先将 top 加 1,然后 stack[top] = x ;弹出元素时,先取出 stack[top] ,然后将 top 减 1。不过,静态数组实现的栈存在一个缺点,即数组大小在初始化时就已确定,如果栈中元素数量超过数组大小,就会发生栈溢出错误。
//静态数组实现栈
//静态栈
#define N 10
struct Stack
{int a[N];//存在与静态数组一样的问题int top;//开小了不够,开大浪费;
};
以下是动态栈的结构:
typedef int STDataType;typedef struct Stack
{STDataType* a;//动态数组int top;//存储栈顶位置int capacity;//空间容量
}ST;
- 链表实现:链表实现栈则更加灵活,它可以动态分配内存。链表的头节点作为栈顶,每次压栈操作就是在链表头部插入一个新节点,每次弹栈操作就是删除链表头部节点。这种实现方式不会出现栈溢出问题(只要系统内存足够),但由于链表节点的内存地址不连续,访问效率相对数组实现会低一些。我们一般使用动态数组实现,本文将围绕动态栈来展开;
二.准备工作
创建对应的三个文件夹:
1.Stack.h:
用于存储顺序表的结构和增删查改函数声明,以及对应的库函数;
2.Stack.c:
用于函数的实现;
3.test.c:
用于测试和修改;
ps:2和3,均要包含头文件1,即(#include"Stack.h").
三.栈的增删查改的实现
1.Stack.h:
栈结构和函数声明:
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
//静态栈
//#define N 10
//struct Stack
//{
// int a[N];
// int top;
//};typedef int STDataType;
//动态栈
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
//打印
void STInit(ST* ps);
销毁
void STDestroy(ST* ps);
//插入
void STPush(ST* ps, STDataType x);
//删除
void STPop(ST* ps);
//有效数据个数
int STSize(ST* ps);
//判空
bool STEmpty(ST* ps);
//返回栈顶元素
STDataType STTop(ST* ps);
老规矩,熟悉熟悉,我们开始函数接口的实现!
2.Stack.c:
我们单刀直入,其实相较于顺序表和链表,我们的栈算是简单的了
2.1栈的初始化
//首先我们先传我们的栈的结构体指针,从而找到我们创建的顺序表
//因为我们这样找到的是地址,所以就不存在形参无法影响实参的问题了
void STInit(ST* ps)
{assert(ps);//断言,防止传空;//动态开辟初始化空间ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL)//老规矩,判断是否开辟失败{perror("malloc fail");//返回错误行return;//直接结束}ps->capacity = 4;//更新空间容量ps->top = 0; //top是栈顶元素的下一个;//ps->top = -1; //top是栈顶元素位置;
}
2.2栈的销毁
void STDestroy(ST* ps)
{assert(ps);free(ps->a);//释放ps->a = NULL;//置空,我们修改的是结构体内部数组,ps->top = 0;//所以只要传一级指针就可以ps->capacity = 0;//全部清空
}
2.3栈的内存检查并扩容
void CapacityCheck(ST* ps)
{assert(ps);
//如果有效数据个数与空间容量相等,说明此时数组已经满了,需要进行扩容;if (ps->top == ps->capacity){//与顺序表没什么两样STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;//更新空间容量}
}
2.4栈的压入(压栈)/栈的插入
void STPush(ST* ps, STDataType x)
{assert(ps);CapacityCheck(ps);//检查ps->a[ps->top] = x;//压入ps->top++;//计量有效数据个数
}
2.5栈的删除(出栈)
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));
//我们只需要top--,将其排除在外即可,因为本来我们插入前,
//这个位置就是随机值,排除在外后,它是什么数值都与我无关了,
//所以置不置为0都没关系ps->top--;
}
2.6返回栈的元素数量
int STSize(ST* ps)
{//top是栈顶元素的下一个;assert(ps);
//直接返回就是元素数量return ps->top;
}
2.7检查栈是否为空
bool STEmpty(ST* ps)
{assert(ps);
//我们初始化是就为0,此时空只要判断即可return ps->top == 0;
}
2.8返回栈顶元素
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];//top是栈顶元素的下一个,所以得减1;
}
2.9完整代码
#define _CRT_SECURE_NO_WARNINGS 1#include"Stack.h"//栈的初始化;
void STInit(ST* ps)
{assert(ps);ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);if (ps->a == NULL){perror("malloc fail");return;}ps->capacity = 4;ps->top = 0; //top是栈顶元素的下一个;//ps->top = -1; //top是栈顶元素位置;
}//栈的销毁;
void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = 0;ps->capacity = 0;
}//栈的内存检查并扩容;
void CapacityCheck(ST* ps)
{assert(ps);if (ps->top == ps->capacity){STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}
}//栈的压入(压栈)/栈的插入;
void STPush(ST* ps, STDataType x)
{assert(ps);CapacityCheck(ps);ps->a[ps->top] = x;ps->top++;
}//栈的删除(出栈);
void STPop(ST* ps)
{assert(ps);assert(!STEmpty(ps));ps->top--;
}//返回栈的元素数量;
int STSize(ST* ps)
{assert(ps);return ps->top;
}//检查栈是否为空;
bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}//返回栈顶元素;
STDataType STTop(ST* ps)
{assert(ps);assert(!STEmpty(ps));return ps->a[ps->top - 1];//top是栈顶元素的下一个,所以得减1;
}
怎么样,我们来测试一下;
3.test.c
代码:
#define _CRT_SECURE_NO_WARNINGS 1#include"Stack.h"int main()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);//printf("%d ", STTop(&st));//STPop(&st);STPush(&st, 3);STPush(&st, 4);//printf("%d ", STTop(&st));//STPop(&st);STPush(&st, 5);while (!STEmpty(&st)){printf("%d ", STTop(&st));STPop(&st);}STDestroy(&st);return 0;
}
怎么样,学会了吗?
四.栈的优缺点
优点
- 操作简单高效:栈的基本操作,如压栈和弹栈,时间复杂度通常为 O ( 1 ) O(1) O(1),实现起来逻辑清晰,执行速度快,能快速地在栈顶进行数据的插入和删除操作,在需要频繁进行此类操作的场景中效率很高。
- 数据管理有序:遵循后进先出的原则,使得数据的存储和访问具有明确的顺序,对于处理具有层次结构或嵌套关系的任务,如表达式求值、函数调用等,能很好地维护数据的逻辑关系,方便进行数据的管理和处理。
- 空间利用灵活:用链表实现栈时,可以根据实际需求动态分配内存空间,理论上只要系统内存足够,就不会出现空间不足的问题,能有效利用系统资源,避免了数组实现可能出现的固定大小限制导致的空间浪费或溢出问题。
- 辅助复杂算法:是许多复杂算法和数据结构的基础组成部分,例如在深度优先搜索算法中,栈可以用来保存搜索路径和状态,帮助算法实现回溯和遍历,为解决更复杂的问题提供了有力支持。
缺点
- 访问限制严格:只允许在栈顶进行操作,要访问栈中的其他元素,必须先将栈顶元素及它与目标元素之间的所有元素弹出,操作不便,缺乏像数组那样可以随机访问元素的灵活性,在需要频繁随机访问数据的场景中效率低下。
- 可能导致栈溢出:使用数组实现栈时,如果事先分配的数组空间过小,当栈中的元素数量超过数组容量时,就会发生栈溢出错误,导致程序异常,而链表实现虽然不容易出现栈溢出,但在系统内存紧张时也可能出现问题。
- 数据组织形式单一:主要适用于满足后进先出需求的场景,对于需要其他数据组织形式,如先进先出(队列)、按照特定顺序排序等情况,栈就无法直接满足需求,需要额外的操作或数据结构来辅助实现。
五.总结
-
栈,这个看似简单的数据结构,实则蕴含着巨大能量。它以独特的后进先出原则,在计算机科学领域中占据着无可替代的地位。从函数调用时对栈帧的精准管理,到表达式求值、括号匹配时的高效运作,栈的身影无处不在。
-
其结构由栈顶指针和栈元素存储区构成,无论是数组实现带来的简单直观与高效访问,还是链表实现提供的动态灵活与无限扩展,都让栈在不同场景下发挥优势。当然,它也存在访问受限、可能溢出等不足,但这些并不影响它成为算法世界的得力助手。
-
深入理解栈,不仅能让我们洞悉程序运行的底层逻辑,更能在算法设计与问题解决中,为我们提供全新的思路和方法。希望大家通过对栈的探索,在编程之路上不断精进,挖掘出更多数据结构的奥秘 。
相关文章:
数据结构:栈篇
ps: 本文所有图均为博主亲手所画,本文所有代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 文章目录 系列文章目录前言一.栈的概念及其结构1.1概念1.2结构 二.准备工作1.Stack…...
药店药品销售管理系统的设计与实现
标题:药店药品销售管理系统的设计与实现 内容:1.摘要 摘要:本文介绍了药店药品销售管理系统的设计与实现。该系统旨在提高药店的运营效率和管理水平,通过信息化手段实现药品销售、库存管理、财务管理等功能。本文详细阐述了系统的需求分析、设计思路、技…...
【AI论文】VideoAuteur:迈向长叙事视频
摘要:近期的视频生成模型在制作持续数秒的高质量视频片段方面已展现出令人鼓舞的成果。然而,这些模型在生成能传达清晰且富有信息量的长序列时面临挑战,限制了它们支持连贯叙事的能力。在本文中,我们提出了一个大规模烹饪视频数据…...
pytorch基于FastText实现词嵌入
FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含࿱…...
PyTorch API 详细中文文档,基于PyTorch2.5
PyTorch API 详细中文文档 按模块分类,涵盖核心函数与用法示例 目录 张量操作 (Tensor Operations)数学运算 (Math Operations)自动求导 (Autograd)神经网络模块 (torch.nn)优化器 (torch.optim)数据加载与处理 (torch.utils.data)设备管理 (Device Management)模…...
leetcode 2300. 咒语和药水的成功对数
题目如下 数据范围 示例 注意到n和m的长度最长达到10的5次方所以时间复杂度为n方的必然超时。 因为题目要求我们返回每个位置的spell对应的有效对数所以我们只需要找到第一个有效的药水就行,这里可以先对potions排序随后使用二分查找把时间复杂度压到nlogn就不会…...
C# 实现 “Hello World” 教程
.NET学习资料 .NET学习资料 .NET学习资料 C# 作为一种广泛应用于.NET 开发的编程语言,以其简洁、高效和类型安全等特性,深受开发者喜爱。在踏入 C# 编程领域时,编写经典的 “Hello World” 程序是重要的起点,它能帮助我们快速熟…...
Elasticsearch——Elasticsearch性能优化实战
摘要 本文主要介绍了 Elasticsearch 性能优化的实战方法,从硬件配置优化、索引优化设置、查询方面优化、数据结构优化以及集群架构设计等五个方面进行了详细阐述,旨在帮助读者提升 Elasticsearch 的性能表现。 1. 硬件配置优化 升级硬件设备配置一直都…...
CentOS 7 搭建lsyncd实现文件实时同步 —— 筑梦之路
在 CentOS 7 上搭建 lsyncd(Live Syncing Daemon)以实现文件的实时同步,可以按照以下步骤进行操作。lsyncd 是一个基于 inotify 的轻量级实时同步工具,支持本地和远程同步。以下是详细的安装和配置步骤: 1. 系统准备 …...
pytorch实现变分自编码器
人工智能例子汇总:AI常见的算法和例子-CSDN博客 变分自编码器(Variational Autoencoder, VAE)是一种生成模型,属于深度学习中的无监督学习方法。它通过学习输入数据的潜在分布(Latent Distribution)&…...
【数据结构】初识链表
顺序表的优缺点 缺点: 中间/头部的插入删除,时间复杂度效率较低,为O(N) 空间不够的时候需要扩容。 如果是异地扩容,增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。 扩容可能会存在…...
【llm对话系统】大模型 Llama 源码分析之并行训练方案
1. 引言 训练大型语言模型 (LLM) 需要巨大的计算资源和内存。为了高效地训练这些模型,我们需要采用各种并行策略,将计算和数据分布到多个 GPU 或设备上。Llama 作为当前最流行的开源大模型之一,其训练代码中采用了多种并行技术。本文将深入 …...
S4 HANA税码科目确定(OB40)
本文主要介绍在S4 HANA OP中税码科目确定(OB40)相关设置。具体请参照如下内容: 税码科目确定(OB40) 在以上界面维护“Transaction Key”的记账码。 在以上界面进一步维护“Transaction Key”确定科目的规则。 Chart of Account:用于明确该规则适用于什么科目表。 …...
Mysql的主从复制及扩展功能
一、配置过程 1.配置master vim /etc/my.cnf [mysqld] datadir/data/mysql 指定数据库文件的存储位置 socket/data/mysql/mysql.sock symbolic-links0 log-binmysql-bin 启用二进制日志,用于记录数据库的更…...
C#,入门教程(10)——常量、变量与命名规则的基础知识
上一篇: C#,入门教程(09)——运算符的基础知识https://blog.csdn.net/beijinghorn/article/details/123908269 C#用于保存计算数据的元素,称为“变量”。 其中一般不改变初值的变量,称为常变量,简称“常量”。 无论…...
ideal的maven使用(两种方法)
方法一: 1.建立一个maven项目 2.像上一篇博客,重新配置一下maven即可 方法二:模块和项目选项一样:...
doris:导入时实现数据转换
Doris 在数据导入时提供了强大的数据转换能力,可以简化部分数据处理流程,减少对额外 ETL 工具的依赖。主要支持以下四种转换方式: 列映射:将源数据列映射到目标表的不同列。 列变换:使用函数和表达式对源数据进行实时…...
开源智慧园区管理系统对比五款主流产品探索智能运营新模式
内容概要 在这个数字化迅速发展的时代,园区管理也迎来了全新的机遇和挑战。众所周知,开源智慧园区管理系统作为一种创新解决方案,正逐步打破传统管理的局限性。它的开放性不仅使得系统可以根据具体需求进行灵活调整,也为用户提供…...
ARM内核:嵌入式时代的核心引擎
引言 在当今智能设备无处不在的时代,ARM(Advanced RISC Machines)处理器凭借其高性能、低功耗的特性,成为智能手机、物联网设备、汽车电子等领域的核心引擎。作为精简指令集(RISC)的典范,ARM核…...
ITS290F Human Computer Interaction
ITS290F Human Computer Interaction & User Experience Design Lab 1. Introduction to CodePen What you’ll learn in this lab: • Understanding CodePen • Creating a front-end page • Using Google form to submit your lab work CodePen is a cloud-based in…...
[Java]继承
1. 什么是继承? 继承是面向对象编程的一种机制,允许一个类(叫做子类)继承另一个类(叫做父类)的属性和方法。也就是说,子类可以“继承”父类的行为(方法)和状态ÿ…...
DeepSeek能下围棋吗?(续)
休息了一下,接着琢磨围棋,其实前面一篇里的规则有个漏洞的,就是邻居关系定义有问题,先回顾一下游戏规则: 游戏规则 定义: 1.数字对,是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…...
51单片机(STC89C52)开发:点亮一个小灯
软件安装: 安装开发板CH340驱动。 安装KEILC51开发软件:C51V901.exe。 下载软件:PZ-ISP.exe 创建项目: 新建main.c 将main.c加入至项目中: main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…...
【数据结构】并查集
1.基本操作 void makeset(){ for(int i1;i<n;i)fa[i]i; }int findd(int x){ while(fa[x]!x)xfa[x]fa[fa[x]]; return x; }void unionn(int x,int y){ int zxfindd(x);int zyfindd(y); if(zx!zy)fa[zy]zx; }2.种类并查集 Parity Game 关押罪犯 [NOIP 2010 提高组] 关押罪…...
基于Rectified Flow FLUX的图像编辑方法 RF-Solver
Diffusion Models专栏文章汇总:入门与实战 前言:现在越来越多的开源模型是基于Rectified Flow,特别是FLUX和HunYuan Video,但是Rectified Flow inversion的性质和之前有所不同,这篇博客解读一下如何使用Rectified Flow对FLUX进行编辑。 目录 RF直接逆向会出现问题 为什R…...
[创业之路-269]:《创业讨论会》- 系统之韵:从麻雀到5G系统的共通性探索
关键词: 从系统的角度,麻雀、人体系统、企业系统、软硬件系统、软件系统、通信系统、5G系统是类似的: 都有:内在看不见的规律、外在显性各种现象 都是:输入、处理、输出 都是:静态、要素、组成、结构、组织…...
C语言指针专题三 -- 指针数组
目录 1. 指针数组的核心原理 2. 指针数组与二维数组的区别 3. 编程实例 4. 常见陷阱与防御 5. 总结 1. 指针数组的核心原理 指针数组是一种特殊数组,其所有元素均为指针类型。每个元素存储一个内存地址,可指向不同类型的数据(通常指向同…...
Contrastive Imitation Learning
机器人模仿学习中对比解码的一致性采样 摘要 本文中,我们在机器人应用的对比模仿学习中,利用一致性采样来挖掘演示质量中的样本间关系。通过在排序后的演示对比解码过程中,引入相邻样本间的一致性机制,我们旨在改进用于机器人学习…...
Springboot使用AOP时,需不需要引入AspectJ?
Springboot使用AOP时,需不需要引入AspectJ? 在Spring Boot中使用AOP时,是否需要引入AspectJ取决于你选择的具体AOP实现方式。以下是详细分步说明: 1. 默认场景:使用Spring AOP(基于代理) 不需要引入AspectJ依赖&am…...
使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录
editor中设置了using exculexing 模拟远程加载addressable可以实现资源热更新,build后的软件却没有成功。 iis服务器中mime中需要设置bundle的文件扩展名,时editor成功,build后失败 原因没有设置hash的扩展名,设置后editor和buil…...
17 一个高并发的系统架构如何设计
高并发系统的理解 第一:我们设计高并发系统的前提是该系统要高可用,起码整体上的高可用。 第二:高并发系统需要面对很大的流量冲击,包括瞬时的流量和黑客攻击等 第三:高并发系统常见的需要考虑的问题,如内存不足的问题,服务抖动的…...
MongoDb user自定义 role 添加 action(collStats, EstimateDocumentCount)
使用 mongosh cd mongsh_bin_path mongosh “mongodb://user:passip:port/db”这样就直接进入了对应的db 直接输入: 这样 role “read_only_role" 就获得了3个 action, 分别是 查询,列举集合,集合元数据查询 P.S: 如果没有 …...
我的AI工具箱Tauri版-Custom3DModelCreationforH2Panel卡通图片2D转绘3D
本教程基于自研的AI工具箱Tauri版进行ComfyUI工作流Custom3DModelCreationforH2Panel卡通图片2D转绘3D。 Custom3DModelCreationforH2Panel卡通图片2D转绘3D 基于先进的SD模型技术,能够将2D动漫图片高效转换为高清的3D图像,满足各种创作需求。通过智能算…...
1 HDFS
1 HDFS 1. HDFS概述2. HDFS架构3. HDFS的特性4. HDFS 的命令行使用5. hdfs的高级使用命令6. HDFS 的 block 块和副本机制6.1 抽象为block块的好处6.2 块缓存6.3 hdfs的文件权限验证6.4 hdfs的副本因子 7. HDFS 文件写入过程(非常重要)7.1 网络拓扑概念7.…...
14-6-3C++STL的list
(一)list的插入 1.list.insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置 #include <iostream> #include <list> using namespace std; int main() { list<int> lst; lst.push_back(10); l…...
GESP2023年12月认证C++六级( 第三部分编程题(2)工作沟通)
参考程序1代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <map> #include <iostream> #include <cmath> #include <vector> using name…...
深度学习的应用
目录 一、机器视觉 1.1 应用场景 1.2 常见的计算机视觉任务 1.2.1 图像分类 1.2.2 目标检测 1.2.3 图像分割 二、自然语言处理 三、推荐系统 3.1 常用的推荐系统算法实现方案 四、图像分类实验补充 4.1 CIFAR-100 数据集实验 实验代码 4.2 CIFAR-10 实验代码 深…...
【自学笔记】MySQL的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 MySQL重点知识点MySQL知识点总结一、数据库基础二、MySQL的基本使用三、数据类型四、触发器(Trigger)五、存储引擎六、索引七、事务处理八、…...
计算机网络之物理层通信基础(信道、信号、带宽、码元、波特、速率、信源与信宿等基本概念)
一、信道 信道是信号的传输媒介,一般用来表示向某一个方向传送信息的介质。信道可以按照不同标准进行分类: 按传输信号分类:可分为模拟信道和数字信道。 按传输介质分类:可分为无线信道和有线信道。无线信道以电磁波为传输介质&…...
C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)
目录 一、STL 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 二、string类 2.1 string类的基本介绍 2.2 string类的默认成员函数 2.2.1 构造函数 2.2.2 析构函数 2.2.3 赋值运算符重载 2.3 string类对象的容量操作 2.3.1 size和length 2.3.2 capacity 2.3.3 r…...
Cursor 背后的技术栈:从 VS Code 到 AI 集成
引言 在当今快速发展的软件开发领域,开发者工具正在经历一场由人工智能(AI)驱动的革命。Cursor 作为一款新兴的智能编程助手,凭借其强大的 AI 能力和高效的开发体验,迅速吸引了大量开发者的关注。Cursor 不仅继承了 V…...
ESP32和STM32在处理中断方面的区别
为了通俗地讲解ESP32和STM32在处理中断方面的区别,我们可以把它们想象成两个不同的“智能管家”系统,各自负责管理一个家庭(即嵌入式项目)的各种任务。我们将重点放在如何处理突发事件(即中断)上。 ESP32 …...
99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)
目录 0. 承前1. 简述:价格指数对比2. 比喻:两大指数对比2.1 简单对比2.2 生动比喻 3. 实际应用3.1 价格传导现象 4. 总结5. 有趣的对比6. 数据获取实现代码7. 数据可视化实现代码 0. 承前 本文主旨: 本文使用小卖部比喻PPI和CPI,…...
计算机网络概述
1. 计算机网络的定义 计算机网络是指由多个通过物理介质或无线方式互相连接的计算设备组成的系统。其主要目的是实现数据的传输和资源共享。网络中的计算设备可以包括台式机、笔记本电脑、服务器、手机、打印机、智能设备等。 网络的广义定义 首先要理解“网络”的广义含义。网…...
169 多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 class Solution { public int majorityElement(int[] nums) { // 存储每个数字的…...
线程配置经验
工作时,时常会遇到,线程相关的问题与解法,本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1)使用线程池…...
算法随笔_34: 最后一个单词的长度
上一篇:算法随笔_33: 132模式-CSDN博客 题目描述如下: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入&am…...
java 正则表达式匹配Matcher 类
Matcher 类 用法 在 Java 中,Matcher 类是用于匹配正则表达式的工具,而 group() 方法是 Matcher 类中的一个重要方法,用于提取匹配结果中的捕获组(captured groups)。以下是对 group() 方法的详细解释: 1.…...
【Blazor学习笔记】.NET Blazor学习笔记
我是大标题 我学习Blazor的顺序是基于Blazor University,然后实际内容不完全基于它,因为它的例子还是基于.NET Core 3.1做的,距离现在很遥远了。 截至本文撰写的时间,2025年,最新的.NET是.NET9了都,可能1…...
python 使用Whisper模型进行语音翻译
目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…...