第六章:数据结构与算法-par1:典型数据结构

文章目录

  • 一、典型数据结构介绍
    • 1.1 基本概念和术语
      • 1、基本数据概念
      • 2、抽象数据类型
      • 3、算法
      • 4、算法复杂度
      • 5、数据结构
  • 二、数据的存储结构
    • 2.1 线性结构
      • 1、线性表(一般线性表)
      • 2、栈和队列(受限线性表)
        • 1) 栈 Stack
        • 2) 队列 Queue
      • 3、串

目标:

  • 掌握典型的数据结构
  • 掌握软件开发中存储对象的定义方法
  • 掌握数据结构与算法基础应用
  • 掌握业务逻辑的算法设计与选择方法

一、典型数据结构介绍

数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序、操作系统数据库系统及其它系统程序和大型应用程序的重要基础。
在这里插入图片描述

1.1 基本概念和术语

1、基本数据概念

数据(data): 是对客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。计算机输入和处理的数据除数值外,还有字符串、表格、图像甚至声音等,它们都是数字编码范畴。
数据元素(data element) :数据的基本单位,在计算机程序中通常作为一个整体,一个数据元素可以由若千个数据项组成,也可以只由一个体进行考虑和处理。数据项组成。数据元素又被称为元素、结点(node)或记录(record)。
数据项(data item): 指数据的不可分割的、含有独立意义的最小单位,数据项有时也称字段(field)或域。(如表中的列)

在这里插入图片描述
数据对象(Data object) : 是性质相同的数据元素的集合,是数据的一个子集。如Boolean={false,true}, Digit={0,1,2,3,4,5}。它们都是数据对象,是一组实例或值。数据对象的实例要么是一个原语(primitive或atomic),要么是由其他数据对象的实例组合而成。对后一种情况我们称对象实例的单个组件为元素(element)。

在这里插入图片描述

2、抽象数据类型

抽象数据类型(Abstract Data Type 简称ADT): 表示(类C语言表示)

  • 抽象数据类型的概念与程序设计语言中的数据类型概念相同。抽象数据类型更为广泛,可以自己定义数据类型。
  • 抽象数据类型只是一个数学模型以及定义在模型上的一组操作。通过对数据的抽象,定义了数据的取值范围以及对数据操作的集合
  • 抽象数据类型的特征是实现与操作分离,从而实现封装,抽象数据类型体现了程序设计中问题分解和信息隐藏的特征。
  • “抽象”的意义在于数据类型的数学抽象特性
ADT抽象数据类型名[
	数据对象:<数据对象的定义>
	数据关系:<数据关系的定义>
	基本操作:<基本操作的定义>
}

在这里插入图片描述

3、算法

1、定义

指一系列确定的而且是在有限步骤内完成的操作。特点如下:

  • 有穷性:能执行结束
  • 确定性:对于相同的输入执行相同的路径
  • 0至多个输入
  • 1多个输出
  • 有效性(可行性)(用于描述算法的操作都是足够基本的)

2、算法与数据结构的关系
计算机科学家沃斯(N.Wirth)提出的:”“程序 =数据结构 + 算法“,一个算法总是建立在一定数据结构上的;反之,算法不确定,就无法决定如何构造数据。
在这里插入图片描述
3、算法设计的要求

  • 正确性:四层含义: (1)无语法错误; (2) 一般输入得出满足规格说明要求的结果; (3)边界、苛刻数据能产生满足规格说明要求的结果, (4)一切合法输入都能产生满足规格说明要求的结果。
  • 可读性:首先是给人读,然后才是机器执行
  • 健壮性:容错性
  • 效率与低存储量需求

4、算法的效率:

一个算法如果能在所要求的·资源限制内将问题解决好,则称这个算法是有效率的。.例如,一个资源限制是:可用来存储数据的全部空间一-可能是分离的内存空间限制和磁盘空间限制以及允许执行每一个子任务所需要的时间。

5、算法的性能的评价:

  • 算法所需的计算时间
  • 算法所需的存储空间
  • 算法的简单性

4、算法复杂度

衡量算法的标准有时间和空间两个维度,具体到评价标准为时间复杂度和空间复杂度

1、算法的时间复杂度

定义:一般情况下,算法中基本操作重复执行的时间问题规模n的某个函数f(n),算法的时间量度记作
T(n) = O(f(n)) “大O记法
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度
在这里插入图片描述

  • 在最后的计算中,去掉低阶项,常数项,所以最终得到O(n3)

2、复杂度的描述

由于算法的时间复杂度分析只考虑相对于问题规模n的增长率,因而,在难以精确计算基本操作执行次数的情况下,只要求出它关于n的增长率即可。

我们可以在计算任何算法运行时间代价时,忽略所有的常数和低次项:
常量阶: 时间复杂度为O(1)
线性阶: 时间复杂度为O(n)
平方阶: 时间复杂度为O(n2)
对数阶: O(log2n)
指数阶: O(2n)
例:如果某算法的运行时间代价为O(5n2 + n),可以忽略其中的低次项和常数,而视该算法的时间复杂度为O(n2)。

3、时间复杂度的等级
以下六种计算算法时间的多项式是最常用的。其关系为:Gamma公式展示
O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3) O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)

指数时间的关系为:   O ( 2 n ) < O ( n ! ) < O ( n n ) \ O(2^n)<O(n!)<O(n^n)  O(2n)<O(n!)<O(nn)
在这里插入图片描述

5、数据结构

数据结构(Data Structure):是相互之间存在一种或多种特定关系的数据元素的集合。

  • 形式定义:
    • 数据结构是一个二元组Data Structure =( D,S)
    • 其中:D是数据元素的有限集,S是D上关系的有限集

数据结构包括逻辑结构和物理结构两个层次。
- 逻辑结构是面向问题的:
- 物理结构是面向计算机的

1)数据的逻辑结构

数据元素之间存在的一种或多种特定的关系被称为数据的逻辑结构。通常有四类基本结构:集合、线性结构、树形结构、图状结构

在这里插入图片描述
在这里插入图片描述

2)数据的物理结构

物理结构,又称存储结构。数据的存储结构是逻辑结构在计算机存储器中的实现。数据元素在计算机中主要有两种不同的存储方法: 顺序存储结构和链式存储结构

  • 顺序存储结构:借助元素在存储器中的相对位置来表示C数据元素之间的逻辑关系(公式化描述)
  • 链式存储结构:借助指示元素存储地址的 指针表示数据元素之间的逻辑关系(链式描述)
    在这里插入图片描述

二、数据的存储结构

2.1 线性结构

1、线性表(一般线性表)

线性表(Linear List),线性表(Linear List)是n(n20)个数据元素的有限序列,表中各个数据元素具有相同的特性,既属于同一数据对象,表中相邻的数据元素之间存在“序偶”关系。是最简单,也是最基本的一种线性数据结构
通常将线性表记做
  ( a 1 , a 2 . . . , a i − 1 , a i , a i + 1 , . . . , a n − 1 , a n ) \ (a_1, a_2 ..., a_{i-1} ,a_i, a_{i+1}, ..., a_{n-1}, a_n )  (a1,a2...,ai1,ai,ai+1,...,an1,an)
表中   a i − 1 \ a_{i-1}  ai1领先于   a i \ a_i  ai   a i \ a_i  ai领先于   a i + 1 \ a_{i+1}  ai+1,称   a i − 1 \ a_{i-1}  ai1   a i \ a_i  ai的直接前驱元素,   a i + 1 \ a_{i+1}  ai+1   a i \ a_i  ai的直接后继元素n是表的长度。
当n=0时,表为空。a是第一个数据元素,a是最后一个数据元素,a;是第i个数据元素其中i为数据元素a在线性表中的位序
除了这种优先关系之外,在线性表中不再有其他的结构

例1:简单的线性表
在这里插入图片描述
例2:复杂点的线性表如下,每一行的数据为一个数据元素
在这里插入图片描述
线性表的存储结构:

  • 顺序存储

    • 内存地址连续
    • 支持随机存取,适用于频繁查询
    • 节约空间
      在这里插入图片描述
  • 链式存储

    • 队了存数据外还会额外一个空间用于存储指针
    • 内存地址不一定连续
    • 适用于频繁插入、删除
    • 存储密度低
      链式存储结构
  • 线性表抽象 数据类型定义:

ADT List{
	数据对象:D={ai |ai ∈ ElemSet,i=1,2,...,n,n>0}
	数据关系:R1={<ai-1,ai lai-1,aieD,i=2,...n}
	基本操作:
		1) lnitList (&L): 操作结果:L初始化为空表
		2) DestroyList(&L) : 操作前提:线性表L已存在。操作结果:L销毁
		3) ClearList(&L): 操作前提:线性表L已存在。操作结果:将表L置为空表。
		4) EmptyList (L): 操作前提:线性表L已存在.操作结果: 如果L为空表则返回真,否则返回假
		5)  ListLength (L): 操作前提:线性表L已存在。操作结果: 如果L为空表则返回0,否则返回表中的元素个数
		6Getltem(L,i,&e): 操作前提:L已存在,1<=i<=listlength(L)。操作结果: 用e返回L中第i个元素的值。
		7LocateElem(L,e):操作前提:L已存在,e为合法元素值。操作结果: 如果L中存在元素e,则将“当前指针”指向元素e所在位置并返回真,否则返回假
		8)ListInsert(&Lie):操作前提:L已存在,e为合法元素值且1<i<ListLength(L)+1。操作结果:L中第i个位置之前插入新的数据元素e,L的长度加1.
		9)PriorElem( L,cur e, &pre e):如果cur e是L中的元素,并且不是第一个,则用pre e返回它的前驱。否则失败。
		10NextElem( L,cur e,&next e):如果cur e是L中的元素,并且不是最后一个,则用next e返回它的后继。否则失败。
		11)ListDelete(&L,i,&e):操作前提:L已存在且非空,1<iListLength(L)。操作结果: 删除L的第i个数据元素,并用e返回其值,L的长度减1
		
}ADT List
  • 利用上述定义的线性表类型,可以实现其它更复杂的操作,例如:归并、拆分、复制、排序。

2、栈和队列(受限线性表)

栈和队列是两种重要的线性结构。从数据结构的角度看,栈和队列是操作受限的线性表:

1) 栈 Stack

栈:限定只能在表的一端进行插入和删除的特殊的线性表

  • 栈顶(top):允许插入和删除的一端(约定top始终指向新数据元素将存放的位置)
  • 栈底(bottom):不允许插入和删除的一端
  • 压入(进栈)是增加数据,弹出(出栈)是删除数据
  • 栈特性: 后进先出 (Last In First Out),简称为LIFO线性表
  • 应用场景: 进制转换、括号匹配
    在这里插入图片描述
    栈的抽象数据类型定义:
    在这里插入图片描述
    栈的基本操作
  • InitStack(&S) : 操作结果:构造一个空的栈S.
  • DestroyStack(&S): 初始条件:栈S已经存在,操作结果: 销毁栈S。
  • ClearStack(&S):初始条件: 栈S已经存在,操作结果: 将栈S重置为空栈
  • StackEmpty(S):初始条件:栈S已经存在,操作结果: 若栈S为空栈,则返回TURE;否则返回FALSE
  • StackLength(S):初始条件: 栈S已经存在,操作结果:返回栈S中的数据元素个数
  • GetTop(S,&e):初始条件: 栈S已经存在且非空,操作结果: 用e返回栈S中栈顶元素的值
  • Push(&S,e):入栈操作,初始条件:栈S已经存在,操作结果: 插入元素e为新的栈顶元素
  • Pop(&S&e):出栈操作,初始条件:栈S已经存在且非空,操作结果: 删除S的栈顶元素并用e返回其值。
  • StackTraverse(S, visit ():初始条件:栈S已经存在且非空,操作结果:从栈底到栈顶依次对S的每个元素调用函数 visit 0。一旦visit (失败,则操作失败

常用操作:初始化栈InitStack(S)、入栈 Push(&S,e)、 出栈 Pop(&S,&e)、获取栈顶元素内容 、GetTop(S,&e)、判断栈是否为空StackEmpty(S)

栈的物理结构:
在这里插入图片描述

2) 队列 Queue

队列(queue)是一种先进先出(FIFO)的线性表,它只允许在表的一端–称为队尾(rear)进行插入操作,而在另一端一称为队头(front)进行删除操作。如图所示
在这里插入图片描述
队列(queue)的场景:: 排队取款、排队购物、排队上车、排队打饭等;WEB客户端的请求在服务器端的排队。

队列 的抽象数据类型定义:
在这里插入图片描述
队列的基本操作:

  • InitQueue(&Q):操作结果:构造一个空的队列Q
  • DestroyQueue(&Q):初始条件: 队列Q已经存在。、操作结果: 销毁队列Q
  • ClearQueue(&Q):初始条件:队列Q已经存在、操作结果: 将队列Q清为空队列
  • EnQueue(&Q,e):入队操作,初始条件:队列Q已经存在。操作结果:插入元素e为新的队尾元素
  • DeQueue(&Q,&e):出队操作,初始条件:队列Q已经存在且非空、操作结果:删除Q的队头元素,并用e返回其值
  • QueueTraverse(Q,visit ()):遍历操作,初始条件:队列Q已经存在且非空,操作结果:从队头到队尾依次对Q的每个元素调用函数visit 0。一旦visit 0失败,则操作失败

3、串

串是由零个或多个字符组成的有限序列,记作:   S = ′ c 1 c 2 c 3 . . . c n ′ \ S='c_1c_2c_3...c_n'  S=c1c2c3...cn
其中,S是串名字c1c2c3…cn’是串值,ci是串中字符,n是串的长度,表示串中字符的数目
空串:零个字符的串称为空串
子串:串中任意个连续的字符组成的子序列
主串:包含子串的串
空串是任意串的子串,任一串是它自身的子串。除它本身外一个串的其它子串都是它的真子串
例:假设a、b、c、d为如下4个串:a=BEl’ b=’JING‘ c=BEIJING d=BEIJING
a,b是C的子串,也是d的子串,但c不是d的子串

串的抽象数据类型定义:
在这里插入图片描述
串的基本操作:

  • StrAssign (&T, chars):初始条件: chars 是字符串常量。操作结果: 把 chars 赋为T的值
  • StrCopy(&T, S):初始条件: 串 S存在,操作结果: 由串 S 复制得串 T。
  • DestroyString (&S):初始条件:串 S存在,操作结果: 串 S被销毁
  • StrEmpty (S):初始条件:串 S存在,操作结果: 若S 为空串,则返回true,否则返回 false
  • StrCompare (S, T):初始条件:串 S和T存在,操作结果: 若S >T,则返回值>0;若S = T,则返回值= 0;若S< T,则返回值< 0
  • StrLength (S):初始条件: 串 S存在.操作结果:返回S的素个数,称为串的长度
  • Concat(&T,S1, S2):初始条件: 串 S1和S2存在、操作结果: 用T返回由S1和S2联接而成的新串
  • SubString (&Sub,S, pos, len):初始条件: 串S 存在,1posStrLength(S)且 O<len<StrLength(S) - pos+1;操作结果: 用Sub返回串S的第 pos 个字符起长度为len的子串
  • Index(S, T pos):初始条件:串S和T存在,T是非空串,1<pos<StrLength(S);操作结果:若主串S中存在和串T值相同的子串则返回它在主串 S中第pos个字符之后第一次出现的位置;否则函数值为0。
  • Replace (&S,T V):初始条件: 串ST和V 均已存在,且T是非空串。操作结果:用V替换主串S中出现的所有与(模式串)T相等的不重叠的子串。
  • Strlnsert(&S, pos,T):初始条件:串S和T存在,1<pos<StrLength(S)+1。操作结果: 在串S的第pos个字符之前插入串T
  • StrDelete (&S, pos, len):初始条件: 串S存在,1<pos<StrLength(S)-len+1.。操作结果: 从串S中删除第pos个字符起长度为len的子串
  • ClearString(&S):初始条件:串S存在,操作结果:将S清为空串

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下套接字TCP实现网络通信

Linux下套接字TCP实现网络通信 文章目录 Linux下套接字TCP实现网络通信1.引言2.具体实现2.1接口介绍1.socket()2.bind()3.listen()4.accept()5.connect() 2.2 服务器端server.hpp2.3服务端server.cc2.4客户端client.cc 1.引言 ​ 套接字(Socket)是计算机网络中实现网络通信的一…

ATA-2161高压放大器的电子实验案例(案例合集)

ATA-2161是一款理想的可放大交直流信号的单通道高压放大器。最大差分输出1600Vp-p(800Vp)高压&#xff0c;可以驱动高压型负载。凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应用也非常频繁&#xff0c;下面为大家整理出ATA-2161高压放大器的应用…

Android全面屏下,默认不会全屏显示,屏幕底部会留黑问题

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 公司以前的老项目&#xff0c;便出现了这种情况&#xff0c;网上搜索了各种资料&#xf…

LVS集群 (四十四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、集群概述 1. 负载均衡技术类型 2. 负载均衡实现方式 二、LVS结构 三、LVS工作模式 四、LVS负载均衡算法 1. 静态负载均衡 2. 动态负载均衡 五、ipvsadm命令详…

docker高级(redis集群三主三从)

1. 新建6个docker容器redis实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilegedtrue -v /…

Matlab图像处理-平移运算

几何运算 几何运算又称为几何变换&#xff0c;是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置&#xff0c;它不改变图像的像素值&#xff0c;只是改变像素所在的几何位置&#xff0c;使原始图像按照需要产生位置、形状和大小的变化。 图像几何运算的一般定义为&#…

STM32使用PID调速

STM32使用PID调速 PID原理 PID算法是一种闭环控制系统中常用的算法&#xff0c;它结合了比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个环节&#xff0c;以实现对系统的控制。它的目的是使 控制系统的输出值尽可能接近预…

JVM——内存模型

1.java内存模型 1.1 原子性 1.2 问题分析 这里与局部变量自增不同&#xff0c;局部变量调用iinc是在局部变量表槽位上进行自增。 静态变量是在操作数栈自增。 这里的主内存和工作内存时再JMM里的说法。 因为操作系统是时间片切换的多个线程轮流使用CPU. 1.3解决方法 JMM中…

从项目中突显技能:在面试中讲述你的编程故事

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

hadoop 学习:mapreduce 入门案例一:WordCount 统计一个文本中单词的个数

一 需求 这个案例的需求很简单 现在这里有一个文本wordcount.txt&#xff0c;内容如下 现要求你使用 mapreduce 框架统计每个单词的出现个数 这样一个案例虽然简单但可以让新学习大数据的同学熟悉 mapreduce 框架 二 准备工作 &#xff08;1&#xff09;创建一个 maven 工…

24个非常实用的Python小技巧

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.唯一性 以下方法可以检查给定列表是否有重复的地方&#xff0c;可用set&#xff08;&#xff09;的属性将其从列表中删除。 x [1,1,2,2,3,2,3,4,5,6] y [1,2,3,4,5] len(x) len(set(x)) # False len(y) len(set(y)) # Tr…

基于LOF算法的异常值检测

目录 LOF算法简介Sklearn官网LOF算法应用实例1Sklearn官网LOF算法应用实例2基于LOF算法鸢尾花数据集异常值检测读取数据构造数据可视化&#xff0c;画出可疑异常点LOF算法 LOF算法简介 LOF异常检测算法是一种基于密度的异常检测算法&#xff0c;基于密度的异常检测算法主要思想…

Vue项目中app.js过大,导致web初始化加载过慢问题

1、删除多余不需要的库&#xff1a; npm uninstall xxx 如例如moment库文件是很大的可以直接放到index.html文件直接CDN引入 2、修改/config/index.js配置文件&#xff1a;将productionGzip设置为false ​ 3、设置vue-router懒加载 懒加载配置&#xff1a; ​ 非懒加载配置&…

基于PIC单片机篮球计分计时器

一、系统方案 本设计采用PIC单片机作为主控制器&#xff0c;矩阵键盘控制&#xff0c;比分&#xff0c;计时控制&#xff0c;24秒&#xff0c;液晶12864显示。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 2、液晶显示程序 /*************…

【JSDocvscode】使用JSDoc、在vscode中开启node调试、使用vscode编写运行Python程序

JSDoc JSDoc是JavaScript的一种注释语法&#xff0c;同时通过JSDoc注释也可以规避js弱类型中不进行代码提示的问题 图形展示JSDoc的效果&#xff1a; 上述没有进行JSDoc&#xff0c;然后我们a点什么 是没有任何提示的 上述就是加上 JSDoc的效果 常用的 vscode 其实内置了 js…

使用apifox前置数据base64编码并添加一个字段

具体前置脚本如下&#xff1a; // pm.request.body.update 处理 body 参数里的变量 let bodyStr pm.request.body.raw; // base64 编码数据 let bodyEncode btoa(bodyStr); console.log(bodyEncode) let newBody {"data": bodyEncode,"sendTime": &qu…

linux 设置与命令基础(二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、系统基本操作 二、命令类型 三、命令语法 四、命令补齐 五、命令帮助 六、系统基本操作命令 总结 前言 这是本人学习Linux的第二天&#xff0c;今天主…

汽车电子笔记之:基于AUTOSAR的电机控制器架构设计

目录 1、概述 2、AUTOSAR设计 2.1、SWC设计 2.2、PORT设计 2.3、Runnable设计 2.4、电机控制器OS实现 1、概述 电机控制器应用层的软件架构较为复杂,主要包括PMSM(Permanent-MagnetSynchronous Motor)的矢量控制算法。根据PMSM的控制算法,对算法中的软件功能进行分析&…

视频集中存储/云存储平台EasyCVR国标GB28181协议接入的报文交互数据包分析

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理…

cortex-A7核LED灯实验--STM32MP157

实验目的&#xff1a;实现LED1 / LED2 / LED3三盏灯工作 一&#xff0c;分析电路图 1&#xff0c;思路 分析电路图可知&#xff1a; 网络编号 引脚编号 LED1 PE10 LED2 > PF10 LED3 > PE8 2&#xff0c;工作原理&#xff1a; 写1&#xff1a;LED灯亮&#xf…