开始梳理大学课程体系(二)--万字数据结构总结上

news2024/11/25 11:31:11

数据结构总结

  • 第一章 概述
    • 1.1 基本概念和术语
    • 1.2 数据结构
      • 1. 2.1 逻辑结构
      • 1.2.2 存储结构
    • 1.3 数据类型和抽象数据类型
      • 1.3.1 数据类型
      • 1.3.2 抽象数据类型
    • 1.4 算法和算法分析
      • 1.4.1 算法的定义及特性
      • 1.4.2 评价算法优劣的基本标准
      • 1.4.3 算法的时间复杂度
      • 1.4.4 算法的空间复杂度
  • 第二章 线性表
    • 2.1 线性表的定义
    • 2.2 线性表的顺序表示和实现
      • 2.2.1 顺序表中的基本操作的实现
    • 2.3 线性表的链式表示和实现
      • 2.3.1 单链表的定义和表示
      • 2.3.2 循环链表
      • 2.3.3 双向链表
    • 2.4 顺序表和链表的比较
  • 第三章 栈和队列的定义和特点
      • 3.1 栈的定义和特点
      • 3.2 顺序栈的表示和实现
      • 3.3链栈的表示和实现

第一章 概述

现在的计算机存储着处理字符、表格和图像等具有一定结构的数据,但是呢,要分清数据的内在联系,合理地组织数据,高效地处理数据,这就是“数据结构”主要研究的问题。

1.1 基本概念和术语

  • 数据
    是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。

  • 数据元素
    是数据的基本单位,在计算机中通常作为一个主题进行考虑和处理。有些情况下,数据元素也称为元素、记录。

  • 数据项
    是组成数据元素的、有独立含义的、不可分割的最小单位。

  • 数据对象
    是性质相同的数据元素的集合,是数据的一个子集。

1.2 数据结构

数据结构是相互之间存在一种或几种特定关系的数据元素的集合。这样子理解,数据结构是带“结构”的数据元素的集合,“结构”就是数据元素之间存在的关系。结构可分为逻辑结构和物理结构。

1. 2.1 逻辑结构

数据的逻辑结构有两个要素:一是数据元素,二是关系。数据元素的含义如前所述,关系是指数据元素之间的关系。
通常有四类基本结构:

  1. 集合结构
  2. 线性结构
  3. 树结构
  4. 图结构或网状结构
    其中集合结构、树结构和图结构都属于非线性结构。

1.2.2 存储结构

数据对象再计算机中的存储表示称为数据的存储结构,也称为物理结构。

  1. 顺序存储结构
  2. 链式存储结构

1.3 数据类型和抽象数据类型

1.3.1 数据类型

数据类型是高级程序设计语言中的基本概念,是一个值的集合和定义在这个值集上的一组操作的总称。
数据类型反映了程序设计语言的数据描述和处理能力。

1.3.2 抽象数据类型

抽象是抽取出实际问题的本质。
抽象数据类型一般指由用户定义的、表示应用为标题的数学模型,以及定义在这个模型上的一组操作的总称。具体包括三个部分:数据对象、数据对象上的关系的集合以及对数据对象的基本操作的集合。

ATD 抽象数据类型名{
	数据对象:<数据对象的定义>
	数据关系:<数据关系的定义>
	基本操作:<基本操作的定义>
}ATD 抽象数据类型名

1.4 算法和算法分析

在涉及运算时,总要联系到该算法处理的对象和结果的数据。为了描述实习某些操作,常常需要设计算法,因而算法时研究数据结构的重要途经。

1.4.1 算法的定义及特性

算法是为了解决某类问题而规定的一个有限长的操作序列。
五个特性:

  1. 有穷性
  2. 确定性
  3. 可行性
  4. 输入
  5. 输出

1.4.2 评价算法优劣的基本标准

  1. 准确性:在合理的数据输入下能够在有限的运行时间内得到准确的结果。
  2. 可读性:便于人们理解和相互交流,方便调试和修改
  3. 健壮性:当输入的数据非法时,能够做出准确的反应或进行处理
  4. 高效性:高效性包括时间和空间两个方面

1.4.3 算法的时间复杂度

算法效率分析的目的是看算法实际是否可行,并在同一问题存在多个算法中可进行时间和空间性能上的比较,以便从中挑选出较忧算法。

  1. 问题的规模是算法求解问题输入量的多少,是问题大小的本质。
  2. 语句频度是指一条语句的重复次数。
    一般情况下,算法中基本语句重复执行的次数是问题规模 n 的某个函数 f(n),算法的时间度量记作:
    T(n) = O(f(n))
    表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
    称算法在最好情况下的时间复杂度为最好的时间复杂度,指的是算法计算量可能达到最小值;
    称算法在最坏情况下的式按键复杂度为最坏时间复杂度,指的是算法的计算量是最大值;

1.4.4 算法的空间复杂度

类似于算法的时间复杂度,采用渐近空间复杂度作为算法所需存储空间的度量,简称空间复杂度。记作:
S(n) = O(f(n))
一般情况下,一个程序在机器上执行时,除了需要寄存本身所用的指令、常数
变量和输入数据外,还需一些对数据进行操作的辅助存储空间。


第二章 线性表

线性结构的基本特点时除了第一个元素无直接前驱,最后一个元素无直接后继之外,其他元素都有一个前驱和一个后继。

2.1 线性表的定义

由n(n>0)个数据特性相同的元素构成的有限序列称为线性表
特点有:

  1. 存在唯一的一个被称为“第一个”的数据元素
  2. 存在唯一的一个被称为“最后一个“的数据元素
  3. 除了第一个之外,结构中的每一个数据元素均只有一个前驱
  4. 除了最后一个之外,结构中的每一个数据元素均只有一个后继

2.2 线性表的顺序表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种也称作线性表的顺序存储结构或顺序映像。线性表的特点是,逻辑上相邻的数据元素,其物理次序也是相邻的

//顺序表的存储结构
#define MAXSIZE 100
typedef struct
{
	ElemType *elem;    //存储空间的基地址
	int length;       //当前长度
}SqList;              //顺序表的结构类型为SqList

2.2.1 顺序表中的基本操作的实现

  1. 初始化
    顺序表的初始化操作就是构造一个空的顺序表
    1. 为顺序表L动态配一个预定义大小的数组空间,使elem指向这段空间的基地址
    2. 将表的当前长度设为0
Status InitLIst(SqList & L)
{ //构造一个空的顺序表
	L.elem = new ElemType[MAXSIZE];     //为顺序表分配一个大小为MAXSIZE的数组空间、
	if(!elem) exit (OVERFLOW);         //存储失败退出
	L.length = 0;                     //空表长度为0
	return ok;
}
  1. 取值
    取值操作时根据指定的位置序号 i ,获取顺序表中第i 个数据元素的值
    1. 判断指定的位置序号 i 值是否合理(1 <= i <= L.length),若不合理,则返回ERROR
    2. 若i值合理,则将第i个数据元素L.elem[i-1]赋值给参数e,通过e返回第i个元素的传值。
Status GetElem(SqList L,int i,ElemType &e)
{
	if (i<1 || i>L.length) return ERROR;    //判断i值是否合理,
	e = L.elem[i-1];                       //elem[i-1]单元存储第i个数据元素
	return ok;
}
  1. 查找
    查找操作时根据指定元素值e,查找顺序表中第1个与e相等的元素,若查找成功,则返回该元素在表中的位置序号,
    1. 重第一个元素其,依次和e1相比较,若找到与e1相等的元素L.elem[i],则查找成功,则返回该元素的序号i + 1
    2. 若查遍了这个顺序表都没有找到,则返回0
int LocatElem(SqList L,ElemType e)
{
	for(i=0;i<length;i++)
		if(L.elem[i == e)  rteurn i+1;
	return o;
}
  1. 插入
    在表中的第i 个位置插入一个新的数据元素e,使长度为n的线性表变成长度为n+1的线性表
    1. 判断插入位置i是否合法,(1<= i <= n+1),若不合法则返回ERROR,
    2. 判断顺序表的存储空间是否已满,若满则返回ERROR,
    3. 将第n个元素至第i个位置的元素一次向后移动一个位置,空出第i个位置
    4. 将要插入的新元素e放入第i个位置
    5. 表长加1
Status ListInser(SqList &L,int i,ElemType e)
{
	if((i<1)||(i>L.length+1)) return ERROR;   //i值不合法
	if(L.length == MAXSIZE) return ERROR;    //当前存储空间已满
	for(j=L.length-1;j>=i-1;j--)
		L.elem[j+1] =L.elem[j];    //插入位置及之后的元素后移
	L.elem[i-1e;                  //将新元素e放入第i个元素
	++L.length;                   //表长加1
	return ok;
}
  1. 删除
    删除操作是将表的第i个元素删除,将长度为n的线性表变成长度n-1的线性表
    1. 判断删除位置i是否合法
    2. 将第i+1个至第n个元素依次向前移动一个位置
    3. 表长减1
Status ListDelete(SqList &L,int i)
{
	if((i<1)|| (i>L.length)) return ERROR;
	for(j=i;j<=.length-1;j++)
		L.elem[j-1] = L.elem[j];
	--L.elemth;
	return ok;
}

2.3 线性表的链式表示和实现

2.3.1 单链表的定义和表示

线性表链式存储结构的特点:用一组任意的存储单元存储线性表的数据元素。

  1. 初始化
    构造一个空表
    1. 生成新结点作为头结点,用头指针L指向头结点
    2. 头结点的指针域置空
Status IntList(LinkList &L)
{
	L = new LNode;
	L->next = NULL;   //生成新结点作为头结点
	return ok;         //头结点的指针置空
}
  1. 取值
    和顺序表不同,链表中逻辑相邻的结点并没有存储在物理相邻的单元中,所以只能从链表的首元结点出发,顺着链域next依次向下访问。
    1. 用指针p指向首元结点,用j做计数器初始化赋为1
    2. 从首元结点开始依次顺着链域向下访问,只要当前结点的指针p不为空,则循环执行操作。
    3. 退出循环。
Status GetElem(LinkList L,int i, ElemType &e)
{
	p = L->next ;           //初始化,p指向首元结点,
	j=1;                 //计数器j初值赋为1
	while(p&&j<i)       //顺链域向后扫描,直到p为空或p指向第i个元素
	{
		p=p->next;     //p指向下一个节点
		++j;          //计数器加1
	}
	if(!p||j>i) return ERROR;  //i值不合法i>n或i<0
	e = p->data;               //去第i个节点的数据域
	return ok;
}
  1. 查找
    从链表的首元节点出发,依次将结点值和指定值e进行比较,返回查找结果
    1. 用指针p指向首元结点
    2. 从首元结点开始依次顺着链域next向下查找,只要p部位空就会一直循环。
    3. 返回p
LNode *LocateElem(LinkList L,ElemType e)
{
	p = L->next;       //初始化,p指向首元结点
	while(p && p->data!=e)   //顺着链域扫描,直到p为空或p所指的的数据域等于e
		p=p->next;            //p指向下一个结点
	return p;
}
  1. 插入
    s->next = p->next; p->next=s
    1. 查找结点a(i-1)并由指针p指向该结点。
    2. 生成一个新结点*s
    3. 将新结点*s的指针域置为e
    4. 将新结点*s的指针域指向结点a(i)
    5. 将结点p1的指针域指向新结点s
Status ListInsert(LinkList &L,int i ,ElemType e)
{
	p=L;j=0;
	while(p&& (j<i-1))
	{
		p = p ->next;   //查找第i-1个结点,p指向该结点
		++j;
	}
	if(!p || j>i-1)  return ERROR;   //i > n+1 或者 i<1
 	s = new LNode;                  //生成新结点*s
	s ->data = e;                   // 将结点*s 的数据域置为e
	s ->next = p->next;             //将结点*s的数据域指向结点a(i)
	p ->next =s;                 //将结点*p的指针域指向结点*s
	return ok;
}
  1. 删除
    同插入一样,首先找到该位置的前驱结点,修改语句如下:
    p ->next = p ->next ->next;
    1. 查找结点a(i)-1并由指针p指向该结点
    2. 临时保存待删除结点a(i)的地址在q中,以备释放
    3. 将结点*p的指针域指向a(i)的直接后继节点
    4. 释放节点啊(i)的空间
 Status ListDelete (LinkList &L,int i)
	{
		p = L;j=0;
		while((p ->next) && (j<i-1))          //查找第i-1个结点,p指向该结点
		{
			p =p ->next; ++j;
		}
		if(!
		(p ->next) || (j>i-1))  rteurn ERROR;
		q = p ->next;
		delete q;
		return ok;
	}
  1. 创建单链表
    根据结点插入位置不同,链表的创建方法可分为前插法和后插法
    前插法:创建一个只有头结点的空链表,
    根据待创建链表包括的元素个数n,循环n次执行操作:生成一个新结点,p,输入元素赋值给新结点p的数据域,将新结点p插入到头结点之后。
    后插法:创建一个只有头结点的空链表,尾指针r初始化,指向头结点,根据链表包括的元素个数n,循环n次执行操作:生成一个新结点
    p,输入元素赋值给新结点p的数据域,将新结点p插入到尾结点,尾指针r指向新的尾结点*p

2.3.2 循环链表

循环链表市另一种形式的链式存储结构,其特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环,语句:
p = B ->next ->next;
B ->next = A ->next;
A ->next =p;
循环链表

2.3.3 双向链表

在双向链表的结点中有两个指针域,一个指向直接后继,另一个指向直接前驱
双向链表

2.4 顺序表和链表的比较

比较项目顺序表链表
存储空间预先分配,会导致空间闲置或溢出现象动态分配,不会导致空间闲置或溢出现象
存储密度不用为表示结点间的逻辑关系而增加额外的存储开销,存储密度等于1需要借助指针来体现元素间的逻辑关系,存储密度小于1
存储元素随机存取,按位置访问元素的时间复杂度为O(1)顺序存储,按位置访问元素时间复杂度为O(n)
插入、删除平均移动约表中一半元素,时间复杂度为O(n)不需要移动元素,确定插入、删除位置后时间复杂度为O(1)
适用情况表变化不大,且 能事先确定变化的范围;很少进行插入或删除操作,经常按元素位置序号访问数据元素。长度变化比较大,频繁进行插入或删除操作

第三章 栈和队列的定义和特点

3.1 栈的定义和特点

栈是限定于仅在表尾进行插入和删除操作的线性表,表尾称栈顶,表头叫栈尾,栈的修改是按先进先出的原则进行的。

3.2 顺序栈的表示和实现

顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。

  1. 初始化
    为顺序栈动态分配一个预定义大小的数组空间
    1. 为顺序栈动态分配一个容量为MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底
    2. 栈顶指针top初始化为base,表示栈为空
    3. 置为栈的空间容量MAXSIZE
Statys IntStack(SqStack &s)
{
		s.base = new SElemTyoe[MAXSIZE];   //动态分配数组
		if(!S.base) exit(OVERFLOW);    //存储动态失败
		S.top = S.base;              //top初始为base,空栈
		S.stacksize = MAXSIZE;    //栈的容量为,MAXSIZE
		return ok;
}
  1. 入栈
    在栈顶插入数据元素
    1. 判断是否满,若满则返回ERRROR
    2. 将新元素压入栈顶,栈顶指针加1
Status Push(SqStack &S, SElemType e)
{
 	if(S.top-S.base == S.atacksize)  ERROR;
 	*S.top++=;
 	return ok;
 }	
  1. 出栈
    指将栈顶元素删除
    1. 判断栈是否为空,
    2. 栈顶指针减1,栈顶元素出栈
Status Pop(SqStack &S,SElemTyep &e)
{
	if(S.top ==S.base) return ERROR;
	e = *--S.top;
	return ok;
}
  1. 取栈元素
SElemType GetTop(SqStack S)
{
	if(S.top!= S.base)
		return *(S.top-1);
}

3.3链栈的表示和实现

采用链式存储结构实现的栈。

  1. 初始化
    就是构造一个空栈。
Status IntStack(LinkStack &s)
{
	S= NULL;
	return ok;
}
  1. 入栈
    链栈入栈前不需要判断栈是否满,只需要动态分配一个结点空间,
    1. 为入栈元素e分配空间,用指针p指向
    2. 将新结点数据域置为e
    3. 将新结点插入栈顶
    4. 修改栈顶指针为p
Stataus Push(LinkStack &S,SElemType e)
{
	p = new StackNode;    //生成新结点
	p -> data =e;        //将新结点数据域置为e
	p ->next = S;        //将新结点插入栈顶
	S = p;             //修改栈顶元素指针为p
	return ok;
}
  1. 出栈
    1. 判断栈是否为空
    2. 将栈顶元素赋给e
    3. 临时保存栈顶元素的空间,以备释放
    4. 修改栈顶指针,指向新的栈顶元素
    5. 释放原栈顶元素的空间
Stataus Push(LinkStack &S,SElemType e)
{
	if(S == NULL)  RETURN ERROR;
	e = S ->data;
	p = S ;
	S =S ->next;
	delete p;
	return ok;
}

ps:现在先写到这,后面会继续完成编写工作,谢谢各位点进来学习交流。

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

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

相关文章

chatgpt赋能python:用Python优化交通

用Python优化交通 作为一种功能强大的编程语言&#xff0c;Python已经被广泛应用于各个领域。交通领域也不例外。在交通领域&#xff0c;Python可以发挥重要作用&#xff0c;帮助优化交通运行&#xff0c;提高安全性和效率。 实时路况预测 Python可以通过机器学习算法来对实…

【Linux】进程与文件系统(详细解析)

文章目录 1.前言&#xff08;提出问题&#xff09;2.认识问题3.回顾c文件接口4.学习系统文件IOopen函数第一个参数第二个参数第三个参数函数的返回值 write函数read函数close函数 5.文件描述符 1.前言&#xff08;提出问题&#xff09; 在C语言阶段学习文件操作的时候&#xf…

基于PP-OCRv3的车牌检测和识别

本项目基于百度飞桨AI Studio平台进行实现&#xff0c;百度出品的深度学习平台飞桨&#xff08;PaddlePaddle&#xff09;是主流深度学习框架中一款完全国产化的产品&#xff0c;与Google TensorFlow、Facebook Pytorch齐名。2016 年飞桨正式开源&#xff0c;是国内首个全面开源…

【SpringMVC】| 域对象共享数据

目录 前期准备 域对象共享数据 一&#xff1a;向request域共享数据&#xff08;五种方法&#xff09; 1. 使用ServletAPI向request域对象共享数据&#xff08;了解&#xff09; 2. 使用ModelAndView向request域对象共享数据 3. 使用Model向request域对象共享数据 4. 使用…

chatgpt赋能python:Python代码怎么找?这里介绍几种方法

Python代码怎么找&#xff1f;这里介绍几种方法 在编写Python程序的时候&#xff0c;经常会遇到需要查找已有代码的情况。那么&#xff0c;在这里&#xff0c;我们将介绍几种查找Python代码的方法&#xff0c;希望能对大家有所帮助。 使用文本编辑器的查找功能 在大多数文本…

3.场(field)

目录 1.复习 2.引言 3.数量场 1.概念 2.例题 4.矢量场 1.概念 2.例题 5.坐标变换和坐标单位矢 1.坐标变换 2.单位矢 1.复习 2.引言 如果说矢量分析研究的是矢量的时间变化&#xff0c;那么场就是它的空间变化. 场是客观存在的&#xff0c;杨振宁先生在总结20世…

Spring Boot 3.1中如何整合Spring Security和Keycloak

在今年2月14日的时候&#xff0c;Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器&#xff0c;这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。但是&#xff0c;如此强大的Keycloak&…

数据库|TiDB 数据库大版本升级-基于TiCDC异机升级

作者&#xff1a;高文峰 | 神州数码云基地TiDB团队成员 目录 一、前言 二、升级架构图 三、升级流程 1.下游TiDB集群部署过程 2. 上游TiCDC节点的扩容 3. 上游数据全备恢复到下游 4. TiCDC启用正向同步任务 5. 应用停服务&#xff0c;tidb 无业务会话连接 6. 确认数据…

2023年6月跟产品开发专家学NPDP产品经理认证课到这里

NPDP产品经理国际资格认证是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 我们针对互联网时代的个人、互联网企业、与传统企业推出一系列学习。 课程从…

小车跑迷宫,如何完成?

先看视频1&#xff1a; 先看视频2&#xff1a; 要制作一个能顺利走到迷宫终点&#xff0c;并能按最短路径回来的小车&#xff0c;重中之重就是寻找其最短路径的算法&#xff0c;迷宫情况复杂多变&#xff0c;多个路口交错纵横&#xff0c;想要完美的找出最短路径并不容易&#…

事件相关功能磁共振波谱技术(fMRS)

导读 质子磁共振波谱(MRS)是一种非侵入性脑成像技术&#xff0c;用于测量不同神经化学物质的浓度。“单体素”MRS数据通常在几分钟内采集&#xff0c;然后对单个瞬态进行平均&#xff0c;从而测量神经化学物质浓度。然而&#xff0c;这种方法对更快速的神经化学物质的时间动态…

chatgpt赋能python:Python人脸身份识别:提高安全性和效率的先进技术

Python人脸身份识别&#xff1a;提高安全性和效率的先进技术 随着科技的发展&#xff0c;人类对于安全性和效率的需求逐渐增加。而人脸身份识别技术正是一个能够满足这一需求的先进技术。在过去的几年中&#xff0c;这种技术已经逐渐发展成为一种普及的安全措施&#xff0c;这…

串口组件:ZylSerialPort.NET 1.83 Crack

ZylSerialPort.NET 1.83 .NET 组件 库 ZylSerialPort.NET 是一个基于线程、事件驱动、异步/同步串口的.NET 组件库。 使用 ZylSerialPort.NET 组件可以轻松地通过串行端口连接与外部设备进行通信&#xff0c;例如调制解调器、条形码阅读器、GSM 模块等。 您也可以将它与 USB、…

Volatile、Synchronized、ReentrantLock锁机制使用说明

一、Volatile底层原理 volatile是轻量级的同步机制&#xff0c;volatile保证变量对所有线程的可见性&#xff0c;不保证原子性。 当对volatile变量进行写操作的时候&#xff0c;JVM会向处理器发送一条LOCK前缀的指令&#xff0c;将该变量所在缓存行的数据写回系统内存。由于缓…

DJ4-7 请求分页存储管理方式

目录 4.7.1 请求分页中的硬件支持 1、页表机制 2、缺页中断机构 4.7.2 内存分配策略和分配算法 1、最小物理块数的确定 2、物理块的分配策略 3、物理块的分配算法 4.7.3 调页策略 1、系统应当在何时把一个页面装入内存&#xff1f; 2、从何处调入页面&#xff1f;…

机器学习常识 12: SVM

摘要: 支持向量机 (support vector machine, SVM) 有很多闪光点, 理论方面有 VC 维的支撑, 技术上有核函数将线性不可分变成线性可分, 实践上是小样本学习效果最好的算法. 1. 线性分类器 如图 1 所示, 基础的 SVM 仍然是一个线性二分类器, 这一点与 logistic 回归一致. 图 1.…

MATLAB 之 隐函数绘图、图形修饰处理、图像处理与动画制作和交互式绘图工具

这里写目录标题 一、隐函数绘图1. 隐函数二维绘图3. 隐函数三维绘图 二、图形修饰处理1. 视点处理2. 色彩处理2.1 颜色的向量表示2.2 色图2.3 三维曲面图形的着色 3. 图形的裁剪处理 三、图像处理与动画制作1. 图像处理1.1 图像的读/写1.2 图像的显示 2. 动画制作2.1 制作逐帧动…

chatgpt赋能python:Python交流App:提高Python社区交流效率

Python 交流 App: 提高 Python 社区交流效率 Python 是当今流行程度最高的编程语言之一&#xff0c;有着广泛的应用场景和庞大的社区。 作为 Python 工程师&#xff0c;经常有各种问题需要得到解决&#xff0c;同时也希望能与同行进行交流、分享和学习。这时&#xff0c;一款高…

Linux——Centos7进入单用户模式修改密码

本篇文章适用于经常忘记自己root用户密码的初学者&#xff01;&#xff01;&#xff01;&#xff0c;会进入单用户模式修改root密码即可。 系统启动进入到如下界面后输入字母“e”; 2.可以看到进入到如下界面&#xff1b; 3.一直下翻到图中圈起来的这部分&#xff1b; 4.在Lin…

excel 获取指定字符前后的字符串

目录 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 2.截取指定字符后的字符串 excel 获取指定字符前后的字符串 1.截取指定字符前的字符串 1.1LEFT FIND find:返回一个字符串在另一个字符串中出现的起始位置。 (区分大小写&#xff0c;且不允许使用通配符) …