C语言-顺序表
🎯引言
欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中,我们将深入探讨各种基本的数据结构和算法,帮助您打下坚实的编程基础。本次我将为你讲解。顺序表(也称为数组)是一种线性表,因其简单易用而广泛应用于各类编程任务中。在本篇文章中,我们将介绍顺序表的基本概念、顺序表的创建和操作方法,以及其优缺点。通过一些实际的代码示例,您将更好地掌握顺序表在C语言中的应用,从而为后续学习其他数据结构打下坚实的基础。
👓顺序表
1.线性表
线性表的概念
线性表是数据结构中最基本、最常用的一种结构,由n个数据元素组成一个有限序列。线性表中的数据元素之间存在一对一的线性关系,即每个元素都有唯一的前驱和后继(除了第一个和最后一个元素)。常见的线性表有:顺序表、链表、栈、队列…
线性表的基本特点:
-
线性关系:每个元素有且仅有一个直接前驱和一个直接后继(第一个元素除外没有前驱,最后一个元素除外没有后继)。
-
唯一性:每个元素在表中的位置是唯一的。
-
相同类型:线性表中的所有元素都是相同的数据类型。
逻辑结构
线性表的逻辑结构是指线性表中元素之间的关系。线性表中的元素具有一对一的线性关系,即每个元素都有唯一的前驱和后继(第一个元素除外没有前驱,最后一个元素除外没有后继)。这种逻辑结构决定了线性表的基本操作和特点。
物理结构
线性表的物理结构是指线性表在计算机内存中的存储方式。主要有两种存储方式:
- 顺序存储结构(顺序表,数组):
- 元素依次存储在一段连续的内存空间中。
- 优点:可以通过索引快速访问元素,查找效率高。
- 缺点:插入和删除操作效率较低,因为需要移动大量元素。
- 链式存储结构(链表):
- 元素存储在任意的内存位置,元素之间通过指针连接。
- 优点:插入和删除操作效率较高,不需要移动元素,只需改变指针。
- 缺点:查找效率较低,因为需要从头遍历到所需位置。
2.顺序表
2.1概念
- 定义:顺序表是由一组连续的存储单元组成的线性表,元素之间的逻辑顺序与物理存储位置相对应。
- 特点:
- 元素类型相同,存储在一块连续的内存空间中。
- 支持通过索引快速访问元素。
- 插入和删除操作需要移动大量元素,效率较低。
- 适用场景:适合于元素数量固定且需要频繁进行查找操作的场景。
2.2结构
顺序表的物理结构如下:
存储结构:使用一段连续的内存空间存储元素,可以通过下标来访问各个元素。(底层本质上数组,对数组进行封装后成了顺序表)
基本操作:
-
插入操作:
-
定义:在顺序表的指定位置插入一个新的元素。
-
步骤:如果插入位置不在表尾,需要将插入位置后的元素依次后移一位,然后将新元素插入到指定位置。
-
时间复杂度:最坏情况下是O(n),因为可能需要移动表尾的所有元素。
-
-
删除操作:
-
定义:删除顺序表中指定位置的元素。
-
步骤:将删除位置后的元素依次前移一位,覆盖被删除的元素位置。
-
时间复杂度:最坏情况下是O(n),因为可能需要移动表尾的所有元素。
-
-
修改操作:
-
定义:修改顺序表中指定位置的元素值。
-
步骤:直接通过索引定位到指定位置,修改元素的值。
-
时间复杂度:O(1),因为修改操作是直接定位到位置进行修改。
-
-
查找操作:
-
定义:查找顺序表中指定元素或元素位置。
-
步骤:通过顺序表的索引直接访问指定位置的元素,或者遍历整个表查找特定元素。
-
时间复杂度:最坏情况下是O(n),因为可能需要遍历整个表来查找元素。
-
2.3分类
2.3.1静态顺序表:
- 定义:静态顺序表是在程序运行前就确定了大小,内存空间是静态分配的,不可动态改变大小。
- 特点:数组长度在创建时固定,不能动态增加或减少。
- 优点:访问速度快,不需要额外的空间管理。
- 缺点:浪费内存空间,不能适应动态变化的数据需求。
//静态顺序表
typedef int SLDateType;
#define N 10
typedef struct SeqList
{SLDateType a[N];int size;
}SeqList;
2.3.2动态顺序表:
- 定义:动态顺序表是在程序运行时根据需要动态分配内存空间的顺序表。
- 特点:可以动态地增加或减少数组的长度。
- 优点:节约内存空间,适应动态变化的数据需求。
- 缺点:可能导致频繁的内存分配和拷贝,影响性能。
typedef int SLDateType;
typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SeqList;
2.4动态顺序表的实现
2.4.1SeqList.h文件
//SeqList.h文件的代码
#include <stdio.h>//标准输入输出库,提供了标准的输入输出函数。
#include <stdlib.h>//标准库,提供了动态内存分配、随机数生成、程序控制等函数。
#include <assert.h>//断言库,用于在程序中插入检查点,确保某个条件为真,如果条件为假则终止程序执行。//动态顺序表
typedef int SLDateType;
typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SeqList;//顺序表初始化
void SeqListInit(SeqList* p);
//顺表打印
void SeqListPrint(SeqList* p);
//顺序表的销毁
void SeqListDestory(SeqList* p);//顺序表尾插
void SeqListPushBack(SeqList* p, SLDateType x);
//顺序表增容
void CheckCapacity(SeqList* p);
//顺序表头插
void SeqListPushFront(SeqList* p, SLDateType x);
//顺序表尾删
void SeqListPopBack(SeqList* p);//在pos位置插入数字
void SeqListInsert(SeqList* p, int pos, SLDateType X);
//删除pos位置的数字
void SeqListErase(SeqList* p,int pos);
//找到指定的数字位置,返回下标
int SeqListFind(SeqList* p, SLDateType x);
代码解析:
动态顺序表结构体定义
typedef int SLDateType;
typedef struct SeqList
{SLDateType* a; // 指向动态数组的指针int size; // 当前动态顺序表中元素的个数int capacity; // 当前动态顺序表的容量
} SeqList;
SLDateType
:定义动态顺序表中存储的元素类型为int
。- struct SeqList:定义了动态顺序表的结构体,包含:
SLDateType* a
:指向动态数组的指针,用于存储顺序表中的元素。int size
:当前动态顺序表中元素的个数。int capacity
:当前动态顺序表的容量,即可以存储的最大元素个数。
函数声明
// 顺序表初始化
void SeqListInit(SeqList* p);
// 顺序表打印
void SeqListPrint(SeqList* p);
// 顺序表的销毁
void SeqListDestory(SeqList* p);// 顺序表尾插
void SeqListPushBack(SeqList* p, SLDateType x);
// 顺序表增容
void CheckCapacity(SeqList* p);
// 顺序表头插
void SeqListPushFront(SeqList* p, SLDateType x);
// 顺序表尾删
void SeqListPopBack(SeqList* p);// 在pos位置插入数字
void SeqListInsert(SeqList* p, int pos, SLDateType X);
// 删除pos位置的数字
void SeqListErase(SeqList* p, int pos);
// 找到指定的数字位置,返回下标
int SeqListFind(SeqList* p, SLDateType x);
这些函数声明定义了动态顺序表的基本操作:
SeqListInit
:初始化动态顺序表。SeqListPrint
:打印动态顺序表中的元素。SeqListDestory
:销毁动态顺序表,释放内存。SeqListPushBack
:尾部插入元素。CheckCapacity
:检查并增加动态顺序表的容量。SeqListPushFront
:头部插入元素。SeqListPopBack
:尾部删除元素。SeqListInsert
:在指定位置插入元素。SeqListErase
:删除指定位置的元素。SeqListFind
:查找指定元素并返回其位置。
这些函数声明提供了对动态顺序表进行初始化、增删改查等基本操作的接口,具体的实现应该在对应的 SeqList.c
文件中完成。
2.4.2SeqList.c文件
//SeqList.c文件
//这里引入了头文件 SeqList.h,其中定义了动态顺序表的结构体 SeqList 和函数声明。
#include "SeqList.h"
//顺序表的初始化
void SeqListInit(SeqList* p)
{assert(p);p->a = NULL;p->size = p->capacity = 0;
}//顺序表的销毁
void SeqListDestory(SeqList* p)
{assert(p);free(p->a);p->a = NULL;p->size = p->capacity = 0;
}//顺序表打印
void SeqListPrint(SeqList* p)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){printf("%d ", p->a[i]);}printf("\n");
}//检查并增加动态顺序表的容量。
void CheckCapacity(SeqList* p)
{assert(p);int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;if (p->capacity == p->size){p->capacity = newcapacity;SLDateType* tmp = (SLDateType*)realloc(p->a, p->capacity * sizeof(SLDateType));if (tmp != NULL){p->a = tmp;}else{exit(1);}}
}//顺序表尾插
void SeqListPushBack(SeqList* p, SLDateType x)
{assert(p);CheckCapacity(p);p->a[p->size] = x;p->size++;
}//顺序表头插
void SeqListPushFront(SeqList* p, SLDateType x)
{assert(p);CheckCapacity(p);int i = 0;for (i = p->size; i > 0; i--){p->a[i] = p->a[i-1];}p->a[0] = x;p->size++;
}//顺序表尾删
void SeqListPopBack(SeqList* p)
{assert(p);assert(p->size);p->size--;}//顺序表头删
void SeqListPopFront(SeqList* p)
{assert(p);assert(p->size);int i = 0;for (i = 0; i < p->size-1; i++){p->a[i] = p->a[i + 1];}p->size--;
}//在pos位置插入数字
void SeqListInsert(SeqList* p, int pos, SLDateType x)
{assert(p != NULL);assert(pos >= 0 && pos <= p->size);//检查是否需要增容CheckCapacity(p);for (int i = p->size-1; i > pos-1 ; --i){p->a[i + 1] = p->a[i];//p->a[pos+1]=p->a[pos]}p->a[pos] = x;p->size++;
}//删除pos位置的数字
void SeqListErase(SeqList* p, int pos)
{assert(p != NULL);assert(pos >= 0 && pos < p->size);for (int i = pos; i < p->size-1; i++){p->a[i] = p->a[i + 1];//p->a[size-2]=p->a[size-1]}p->size--;
}//找到指定的数字位置,返回下标
int SeqListFind(SeqList* p, SLDateType x)
{assert(p != NULL);for (size_t i = 0; i < p->size; i++){if (p->a[i] == x){return i;}}return -1;
}
代码解析:
初始化函数 SeqListInit
void SeqListInit(SeqList* p)
{assert(p);p->a = NULL;p->size = p->capacity = 0;
}
- 功能:初始化动态顺序表。
- 说明:将动态顺序表指针
p
所指向的顺序表a
设置为NULL
,并将size
(元素个数)和capacity
(容量)都设置为0
。使用断言assert(p)
确保传入的指针p
不为空。
销毁函数 SeqListDestory
void SeqListDestory(SeqList* p)
{assert(p);free(p->a);p->a = NULL;p->size = p->capacity = 0;
}
- 功能:销毁动态顺序表。
- 说明:释放动态顺序表
a
所指向的内存空间,将a
置为NULL
,并将size
和capacity
置为0
。同样使用断言assert(p)
确保传入的指针p
不为空。
打印函数 SeqListPrint
void SeqListPrint(SeqList* p)
{assert(p);int i = 0;for (i = 0; i < p->size; i++){printf("%d ", p->a[i]);}printf("\n");
}
- 功能:打印动态顺序表中的元素。
- 说明:遍历顺序表
a
中的每个元素,依次打印出来。使用断言assert(p)
确保传入的指针p
不为空。
增容函数 CheckCapacity
void CheckCapacity(SeqList* p)
{assert(p);int newcapacity = p->capacity == 0 ? 4 : p->capacity * 2;if (p->capacity == p->size){p->capacity = newcapacity;SLDateType* tmp = (SLDateType*)realloc(p->a, p->capacity * sizeof(SLDateType));if (tmp != NULL){p->a = tmp;}else{exit(1);}}
}
- 功能:检查并增加动态顺序表的容量。
- 说明:
- 如果当前顺序表
a
的容量capacity
等于当前元素个数size
,则表示需要增加容量。 - 计算新的容量
newcapacity
,如果当前容量为0
,则设置为4
,否则扩大为原来的两倍。 - 使用
realloc
函数重新分配a
的内存空间,将新的容量分配给a
。如果分配失败,程序退出。 - 使用断言
assert(p)
确保传入的指针p
不为空。
- 如果当前顺序表
尾部插入函数 SeqListPushBack
void SeqListPushBack(SeqList* p, SLDateType x)
{assert(p);CheckCapacity(p);p->a[p->size] = x;p->size++;
}
- 功能:在动态顺序表尾部插入元素
x
。 - 说明:首先调用
CheckCapacity
函数检查并增加容量。然后将元素x
插入到顺序表a
的末尾,并更新size
。
头部插入函数 SeqListPushFront
void SeqListPushFront(SeqList* p, SLDateType x)
{assert(p);CheckCapacity(p);int i = 0;//元素从后往前依次往后移动一位 注:不能从前往后 因为前面的元素往后移动会覆盖掉后面的元素for (i = p->size; i > 0; i--){p->a[i] = p->a[i-1];}p->a[0] = x;p->size++;
}
- 功能:在动态顺序表头部插入元素
x
。 - 说明:首先调用
CheckCapacity
函数检查并增加容量。然后将顺序表a
中的所有元素后移一位,为新元素腾出空间,最后将x
插入到顺序表a
的第一个位置,并更新size
。
尾部删除函数 SeqListPopBack
void SeqListPopBack(SeqList* p)
{assert(p);assert(p->size > 0);p->size--;
}
- 功能:从动态顺序表尾部删除元素。
- 说明:首先使用断言
assert(p)
确保顺序表不为空,然后将size
减一,表示删除尾部的元素。
头部删除函数 SeqListPopFront
void SeqListPopFront(SeqList* p)
{assert(p);assert(p->size > 0);int i = 0;//元素从前往后依次向前移动一位 for (i = 0; i < p->size-1; i++){p->a[i] = p->a[i + 1];}p->size--;
}
- 功能:从动态顺序表头部删除元素。
- 说明:首先使用断言
assert(p)
确保顺序表不为空,然后将顺序表a
中的所有元素前移一位,覆盖掉第一个元素,最后将size
减一,表示删除头部的元素。
插入函数 SeqListInsert
void SeqListInsert(SeqList* p, int pos, SLDateType x)
{assert(p != NULL);assert(pos >= 0 && pos <= p->size);CheckCapacity(p);//元素从后往前依次向后移动一位 for (int i = p->size-1; i >= pos; --i){p->a[i + 1] = p->a[i];}p->a[pos] = x;p->size++;
}
- 功能:在指定位置
pos
插入元素x
。 - 说明:
- 首先使用断言确保顺序表和位置参数有效。
- 调用
CheckCapacity
函数检查并增加容量。 - 将插入位置
pos
后的所有元素依次后移一位,为新元素x
腾出空间。 - 将元素
x
插入到指定位置pos
,并更新size
。
删除函数 SeqListErase
void SeqListErase(SeqList* p, int pos)
{assert(p != NULL);assert(pos >= 0 && pos < p->size);//元素从前往后依次向前移动一位 for (int i = pos; i < p->size-1; i++){p->a[i] = p->a[i + 1];}p->size--;
}
- 功能:删除指定位置
pos
的元素。 - 说明:
- 首先使用断言确保顺序表和位置参数有效。
- 将指定位置
pos
后的所有元素依次前移一位,覆盖掉要删除的元素。 - 最后将
size
减一,表示删除了一个元素。
查找函数 SeqListFind
int SeqListFind(SeqList* p, SLDateType x)
{assert(p != NULL);for (size_t i = 0; i < p->size; i++){if (p->a[i] == x){return i;}}return -1;
}
- 功能:查找顺序表中值为
x
的元素,返回其位置索引。 - 说明:
- 使用断言确保顺序表有效。
- 遍历顺序表
a
中的所有元素,找到第一个值等于x
的元素,返回其位置索引。 - 如果未找到,返回
-1
表示未找到。
🥇结语
通过本篇文章,我们详细介绍了顺序表这一重要的数据结构及其在C语言中的实现与应用。我们探讨了顺序表的基本概念、操作方法以及优缺点,并通过实例代码展示了如何在实际编程中使用顺序表。掌握顺序表不仅有助于理解其他更复杂的数据结构,还能提高代码编写和优化能力。希望本文能为您的编程之旅提供有益的指导。请继续关注HanLop博客,下一篇文章我们将探讨另一种常见的数据结构——链表,敬请期待!
相关文章:

C语言-顺序表
🎯引言 欢迎来到HanLop博客的C语言数据结构初阶系列。在这个系列中,我们将深入探讨各种基本的数据结构和算法,帮助您打下坚实的编程基础。本次我将为你讲解。顺序表(也称为数组)是一种线性表,因其简单易用…...

OpenCV漫水填充函数floodFill函数的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 功能描述 ffloodFill函数是OpenCV库中用于图像处理的一个功能,它用于填充与种子点颜色相近的连通区域。这个函数在很多场景下都非常有用&#x…...

redis内存分析
阿里云redis集群对key进行hash后保存在对应的后端节点,使每个节点的key数量大致相同,但是如果存在大key,就会导致单个节点内存用满,可以使用redis-rdb-tools 或rdr来对内存进行分析。 redis-rdb-tools redis-rdb-tools通过对dum…...

redis批量删除keys,用lua脚本。
文章目录 现象解决方法 现象 系统报错: misconf redis is configured to save ....后查看机器内存。 是内存满了,需要删除其中的key 解决方法 (1) 编写一个脚本,放在redis-cli.exe同一个目录 (2) 脚本内容如下: -- 使用Lua脚…...

Python-找客户软件
软件功能 请求代码: 填充表格: 可以search全国各个区县的所有企业信息,过滤手机号、查看是否续存/在业状态。方便找客户。 支持定-制-其他引-留-阮*件(XHSS,DYY,KS,Bi-li*Bi-li) V*…...

STM32 - PWR 笔记
PWR(Power Control)电源控制 PWR 负责管理 STM32 内部的电源供电部分,可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD…...

标准盒模型和怪异盒子模型的区别
在 CSS 中,标准盒模型和怪异盒模型是两种不同的盒子模型计算方式,主要区别如下: 一、标准盒模型(content-box) 1. 定义与组成 - 标准盒模型是 CSS 中默认的盒模型。 - 它由内容区域(content)、…...

推荐算法——MRR
定义: MRR计算的是第一个正确答案的排名的倒数,并对所有查询取平均值。它衡量了模型在排序结果中快速找到正确答案的能力。 其中: Q 是查询的总数。ranki 是第 i 个查询中第一个正确答案的排名(位置)。如果第一个正…...

idea中打开静态网页端口是63342而不是8080
问题: 安装了tomcat 并且也配置了环境,但是在tomcat下运行,总是在63342下面显示。这也就意味着,并没有运行到tomcat环境下。 找了好几个教程(中间还去学习了maven,因为跟的教程里面,没有maven,但…...

Vue3框架搭建3:配置说明-prettier配置
1、配置说明: .prettierrc.json{"$schema": "https://json.schemastore.org/prettierrc","semi": false,"tabWidth": 2,"singleQuote": true,"printWidth": 100,"trailingComma": "no…...

SQL MySQL定时器/事件调度器(Event Scheduler)
事件调度器(Event Scheduler)在MySQL数据库系统中是一个强大的功能组件,它允许用户定义一系列称为“事件”的数据库对象,这些事件在指定的时间或时间间隔自动执行预定义的SQL语句或操作。事件调度器通过维护一个时间计划表来管理这…...

从0到1构建渠道运营体系:实战案例与策略指南
引言 在当今竞争激烈的市场环境中,有效的渠道运营是企业实现产品或服务快速触达目标用户、提升市场份额的关键。从零开始构建一个高效的渠道运营体系,不仅需要深思熟虑的策略规划,还需要灵活应变的实战操作。本文将结合实战案例,…...

Java版Flink使用指南——将消息写入到RabbitMQ的队列中
大纲 新建工程新增依赖 编码自动产生数据写入RabbitMQ 测试工程代码 在 《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们介绍了如何使用Java在Flink中读取RabbitMQ中的数据,并将其写入日志中。本文将通过代码产生一些数据…...

python excel openpyxl
python excel LTS 在开始之前,确保已经安装了 Python 和所需的库。 主要使用以下库: openpyxl:用于读取和写入 Excel 文件。 pandas:用于数据处理和分析。 xlwings:用于将 Python 与 Excel 连接,实现双向…...

C++八股(一)
目录 一、new和malloc ⭐ 二、class和struct的区别 ⭐ 三、char和int之间的转换 四、什么是野指针和悬挂指针 ⭐ 五、NULL和nullptr区别⭐ 六、指针常量和常量指针有何区别⭐ 七、物理内存和虚拟内存的区别⭐ 八、重载、重写和隐藏的区别⭐ 九、简述面向对象(OOP)的…...

【Git的基本操作】版本回退 | 撤销修改的三种情况 | 删除文件
目录 5.版本回退 5.1选项hard&后悔药 5.2后悔药&commit id 5.3版本回退的原理 6.撤销修改 6.1情况一 6.2情况二 6.3情况三 7.删除文件 Git重要能力之一马,版本回退功能。Git是版本控制系统,能够管理文件历史版本。本篇以ReadMe文件为…...

STM32-I2C
本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. I2C通信1.1 I2C通信简介1.2 硬件电路1.3 I2C时序基本单元1.3.1 起始条件和终止条件1.3.2 发送一个字节1.3.3 接收一个字节1.3.4 发送应答和接收应答 1.4 I2C时序1.4.1 指定地址写1.4.2 当前地址读1.4.3 指定地址读…...

04.ffmpeg打印音视频媒体信息
目录 1、相关头文件 2、相关结构体 3、相关函数 4、函数详解 5、源码附上 1、相关头文件 #include <libavformat/avformat.h> 包含格式相关的函数和数据结构 #include <libavutil/avutil.h> 包含一些通用实用函数 2、相关结构体 AV…...

微信开发授权登录梳理总结
授权登录流程对比 微信公众号/网页 微信文档地址:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 流程图如下: 特殊说明: 步骤1拼接的微信地址是:https://open.weixin.qq…...

HTML5实现我的音乐网站源码
文章目录 作者:[xcLeigh](https://blog.csdn.net/weixin_43151418) 1.设计来源1.1 界面效果1.2 轮播图界面1.3 音乐播放界面1.4 视频播放界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作…...

UNI_App平台调试指南 debug(十五)
App平台调试指南 debug 常规开发里,在 HBuilderX 的运行菜单里运行 App,手机端的错误或 console.log 日志信息会直接打印到控制台。 如果需要更多功能,比如审查元素、打断点 debug,则需要启动调试模式。自 HBuilderX 2.0.3+ 版本起开始支持 App 端的调试。 #打开调试窗口…...

LLM之RAG实战(四十一)| 使用LLamaIndex和Gemini构建高级搜索引擎
Retriever 是 RAG(Retrieval Augmented Generation)管道中最重要的部分。在本文中,我们将使用 LlamaIndex 实现一个结合关键字和向量搜索检索器的自定义检索器,并且使用 Gemini大模型来进行多个文档聊天。 通过本文,我…...

【错题集-编程题】AOE还是单体?(贪心)
牛客对应链接:AOE还是单体? (nowcoder.com) 一、分析题目 如果使用一次 AOE 造成的伤害比消耗的蓝量多,那就使用。否则就一直使用单体伤害。 二、代码 //值得学习的代码 #include <iostream> #include <algorithm>using namespa…...

怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~
怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~ 文章目录 怎么办?我的C盘又爆红了!别慌!博主手把手带你管理你的C盘空间~0. 在开始清理之前1. 推荐执行的操作1.1 清理系统缓存文件1.2 磁盘清…...

react启用mobx @decorators装饰器语法
react如果没有经过配置,直接使用decorators装饰器语法会报错: Support for the experimental syntax ‘decorators’ isn’t currently enabled 因为react默认是不支持装饰器语法,需要做一些配置来启用装饰器语法。 step1: 在 tsconfig.js…...

计算机如何学习
1. 不要只盯着计算机语言学习,你现在已经学习了C语言和Java,暑假又规划学习Python,最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言,沿着这个方向继续往后学习知识就行。计算机语言是学不完的,而未…...

【Python 基础】函数 - 1
函数 从前面的章节中,你已经熟悉了 print()、input()和 len()函数。Python 提供了这样一些内建函数,但你也可以编写自己的函数。“函数”就像一个程序内的小程序。 为了更好地理解函数的工作原理,让我们来创建一个 函 数 。 在 文 件 编 辑器 中 输 入 下 面 的 程 序 , …...

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)
1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈😭😭) 示例图…...

概率统计(二)
二维离散型 联合分布律 样本总数为16是因为,两封信分别可以放在4个信箱 边缘分布律 条件分布律 独立性 选填才能用秒杀 联合概率乘积不等于边缘概率的乘积则不独立 二维连续型 区间用一重积分面积用二重积分 离散型随机变量 常见6个分布的期望和方差 离散型随机变…...

文件类:如何将excel文件转为csv文件(且保留时间格式)?
最近有个场景,在ftp服务器上,读取csv文件并入库,但是客户提供的一部分文件却是xls文件,就得搞个将excel转为csv文件的方法,话不多说直接开干。 方法 public static void convertExcelToCSV(String excelFilePath, Str…...