【数据结构篇C++实现】- 图

友情链接:C/C++系列系统学习目录

文章目录

  • 🚀一、图的基本概念和术语
    • 1、有向图和无向图
    • 3、基本图和多重图
    • 4、完全图
    • 5、子图
    • 6、连通、连通图和连通分量
    • 7、强连通图、强连通分量
    • 8、生成树、生成森林
    • 9、顶点的度、入度和出度
    • 10、边的权和网
    • 11、稠密图、稀疏图
    • 12、路径、路径长度和回路
    • 13、 简单路径、简单回路
    • 14、距离
    • 15、有向树
  • 🚀二、图的表示:邻接表
    • ⛳(一)邻接列表原理精讲
    • ⛳(二)邻接表的算法实现
      • 1.邻接表结构的定义
      • 2.邻接表的初始化
      • 3.邻接表的创建
  • 🚀三、邻接表的深度遍历
    • ⛳(一)深度优先遍历算法原理
    • ⛳(二)深度优先遍历算法实现
  • 🚀四、邻接表的广度遍历
    • ⛳(一)广度优先遍历算法原理
    • ⛳(二)广度优先遍历算法实现
  • 程序清单


🚀一、图的基本概念和术语

**概念:**在计算机科学中,一个图就是一些顶点的集合,这些顶点通过一系列边结对(连接)。顶点用圆圈表示,边就是这些圆圈之间的连线。顶点之间通过边连接。注意:顶点有时也称为节点或者交点,边有时也称为链接。 社交网络,每一个人就是一个顶点,互相认识的人之间通过边联系在一起, 边表示彼此的关系。这种关系可以是单向的,也可以是双向的!

树和链表都是图的特例,在线性表中,数据元素之间是被串起来的,仅有线性关系,每个数据元素只有一个直接前驱和一个直接后继。在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。图是一种较线性表和树更加复杂的数据结构。在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。

如果一个编程问题可以通过顶点和边表示,那么我们就可以将问题用图画出来,然后使用相应的算法来找到解决方案

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJ0nLt8L-1690729858577)(E:\create\图片\图\1.png)]

1、有向图和无向图

在这里插入图片描述

在这里插入图片描述

3、基本图和多重图

一个图G若满足:①不存在重复边;②不存在顶点到自身的边,则称图G为简单图。上图中G1 和G2 均为简单图。数据结构中仅讨论简单图。

若图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联,则G为多重图。多重图的定义和简单图是相对的。

4、完全图

对于无向图,在完全图中任意两个顶点之间都存在边。

对于有向图,在有向完全图中任意两个顶点之间都存在方向相反的两条弧。

上图中G2为无向完全图,而G3为有向完全图。

在这里插入图片描述

5、子图

上图中G3为G1的子图。

6、连通、连通图和连通分量

在无向图中,若从顶点v到顶点w有路径存在,则称v和w是连通的。若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图。无向图中的极大连通子图称为连通分量。若一个图有n个顶点,并且边数小于n − 1,则此图必是非连通图。如下图(a)所示, 图G4有3个连通分量,如图(b)所示。

在这里插入图片描述

注意:弄清连通、连通图、连通分量的概念非常重要。首先要区分极大连通子图和极小连通子图,极大连通子图是无向图的连通分量,极大即要求该连通子图包含其所有的边;极小连通子图是既要保持图连通又要使得边数最少的子图。

7、强连通图、强连通分量

在有向图中,若从顶点v到顶点w和从顶点w到项点v之间都有路径,则称这两个顶点是强连通的。若图中任何一对顶点都是强连通的,则称此图为强连通图。有向图中的极大强连通子图称为有向图的强连通分量,图G1的强连通分量如下图所示。

在这里插入图片描述

注意:强连通图、强连通分量只是针对有向图而言的。一般在无向图中讨论连通性,在有向图中考虑强连通性。

8、生成树、生成森林

连通图的生成树是包含图中全部顶点的一个极小连通子图。若图中顶点数为n,则它的生成树含有n − 1条边。对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。在非连通图中,连通分量的生成树构成了非连通图的生成森林。图G2的一个生成树如下图所示。

在这里插入图片描述

注意:包含无向图中全部顶点的极小连通子图,只有生成树满足条件,因为砍去生成树的任一条边,图将不再连通。

9、顶点的度、入度和出度

图中每个顶点的度定义为以该项点为一个端点的边的数目。

对于有向图,顶点v vv的度分为入度出度,入度就是进来的边,出度就是出去的边

10、边的权和网

在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值。这种边上带有权值的图称为带权图,也称

11、稠密图、稀疏图

边数很少的图称为稀疏图,反之称为稠密图。稀疏和稠密本身是模糊的概念,稀疏图和稠密图常常是相对而言的。

12、路径、路径长度和回路

顶点vp到顶点vq之间的一条路径是指它们之间的顶点序列(包括本身),当然关联的边也可以理解为路径的构成要素。路径上边的数目称为路径长度。第一个顶点和最后一个顶点相同的路径称为回路。若一个图有n个顶点,并且有大于n − 1条边,则此图一定有环。

13、 简单路径、简单回路

在路径序列中,顶点不重复出现的路径称为简单路径。除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。

14、距离

从顶点u出发到顶点v的最短路径若存在,则此路径的长度称为从u到v的距离。若从u到v根本不存在路径,则记该距离为无穷( ∞ )。

15、有向树

一个顶点的入度为0、其余顶点的入度均为1的有向图,称为有向树。

🚀二、图的表示:邻接表

⛳(一)邻接列表原理精讲

  • 在邻接列表实现中,每一个顶点会存储一个从它这里开始的相邻边的列表。比如,如果顶点 B 有一条边到 A、C 和 E,那么 B 的列表中会有 3 条边。
  • 邻接列表只描述指向外部的边。B 有一条边到 A,但是 A 没有边到 B,所以 B 没有出现在 A 的邻接列表中。
  • 查找两个顶点之间的边或者权重会比较费时,因为要遍历邻接列表直到找到为止。

img

邻接矩阵:

由二维数组对应的行和列都表示顶点,由两个顶点所决定的矩阵对应元素数值表示这里两个顶点是否相连(如,0表示不相连,非0表示相连和权值)﹑如果相连这个值表示的是相连边的权重。例如,广西到北京的机票,我们用邻接矩阵表示:

  • 行表示起点,列表示终点
  • 往这个图中添加顶点的成本非常昂贵,因为新的矩阵结果必须重新按照新的行/列创建,然后将已有的数据复制到新的矩阵中。
  • 即用两个数组来表示图。一个一维数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNpfMlMW-1690729858579)(E:\create\图片\图\2.png)]

#define MaxVertexNum 100	//顶点数目的最大值
typedef char VertexType;	//顶点的数据类型
typedef int EdgeType;	//带权图中边上权值的数据类型
typedef struct{
	VertexType Vex[MaxVertexNum];	//顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum];	//邻接矩阵,边表
	int vexnum, arcnum;	//图的当前顶点数和弧树
}MGraph;

比较:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjUq1hBo-1690729858580)(E:\create\图片\图\3.png)]

结论:大多数时候,选择邻接列表是正确的。(在图比较稀疏的情况下,每一个顶点都只会和少数几个顶点相连,这种情况下邻接列表是最佳选择。如果这个图比较密集,每一个顶点都和大多数其他顶点相连,那么邻接矩阵更合适。)

⛳(二)邻接表的算法实现

在这里插入图片描述

顶点表结点由顶点域(data)和指向第一条邻接边的指针(firstarc) 构成,边表(邻接表)结点由邻接点域(adjvex)和指向下一条邻接边的指针域(nextarc) 构成。

1.邻接表结构的定义

#define MAXSIZE 1024

typedef struct _EdgeNode//新的边
{
	int adjvex;//邻接的顶点 (用下标位置来表示)
	int weight;//权重
	struct _EdgeNode *next;//指向下一个顶点/边
}EdgeNode;
 
typedef struct _VertexNode//顶点结点
{
	char data;//结点数据
	struct _EdgeNode *first; 	//指向邻接的第一条边
}VertexNode,*AdjList;
 
typedef struct _AdJListGraph
{
	AdjList adjList;//顶点数组,结构体数组
	int numVex;
	int numEdg;
}AdjListGraph;

2.邻接表的初始化

bool Init(AdjListGraph &gh)
{
	gh.adjList = new VertexNode[MAXSIZE];//分配顶点数组地址
	if (!gh.adjList) return false;
 
	gh.numEdg = 0;
	gh.numVex = 0;
 
}

在这里插入图片描述

3.邻接表的创建

//寻找顶点的数据找到数组的下标
int Location(AdjListGraph gh, char c)
{
	if (gh.numVex <= 0) return -1;
 
	for (int i=0;i<gh.numVex;i++)
	{
		if (c==gh.adjList[i].data)
		{
			return i;
		}
	}
	
	return-1;
}
 
//图的创建
void CreateALGraph(AdjListGraph &gh)
{
	cout << "输入图的定点数 和边数:";
	cin >> gh.numVex >> gh.numEdg;
	if (gh.numVex > MAXSIZE) return;
 
	cout << endl << "输入相关顶点: " << endl;
	//保存顶点
	for (int i=0;i<gh.numVex;i++)
	{
		cin >> gh.adjList[i].data;
		gh.adjList[i].first = NULL;  //顶点的第一条边目前连接为空
	}
 
	char vi, vj;//保存输入的顶点;
	int i, j;
	cout << "请依次输入边(vi,vj)上的顶点序号:" << endl;
 
    for(int k = 0; k < gh.numEdg; k++)
	{
		cin >> vi >> vj;
		i = Location(gh, vi);  	//获取要连接的两个点在数组中的下标
		j = Location(gh, vj);
 
		if (i>=0 && j>=0)
		{   
            //头插法插入边
			EdgeNode *temp = new EdgeNode;  
			temp->adjvex = j;  
			temp->next = gh.adjList[i].first;
			gh.adjList[i].first = temp;
		}
	}
}

在这里插入图片描述

🚀三、邻接表的深度遍历

⛳(一)深度优先遍历算法原理

首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;

当没有未访问过的顶点时,则回到上一个顶点,继续试探别的顶点,直到所有的顶点都被访问过。

img

使用深度优先搜索来遍历这个图的具体过程是:

  1. 首先从一个未走到过的顶点作为起始顶点,比如 A 顶点作为起点。
  2. 沿 A 顶点的边去尝试访问其它未走到过的顶点,首先发现 E 号顶点还没有走到过,于是访问 E 顶点。
  3. 再以 E 顶点作为出发点继续尝试访问其它未走到过的顶点,接下来访问 D 顶点。
  4. 再尝试以 D 顶点作为出发点继续尝试访问其它未走到过的顶点。
  5. 但是,此时沿 D 顶点的边,已经不能访问到其它未走到过的顶点,接下来返回到 E 顶点。
  6. 返回到 E 顶点后,发现沿 E 顶点的边也不能再访问到其它未走到过的顶点。此时又回到顶点 AD-> E-> A),再以 A 顶点作为出发点继续访问其它未走到过的顶点,于是接下来访问 C 点。
  7. 以此类推
  8. 最终访问的结果是 A -> E -> D -> C -> B

⛳(二)深度优先遍历算法实现

bool visited[MAXSIZE] = {0};//全局数据用来判断元素是否被访问过
 
//对图上的顶点进行深度遍历
void DFS(adjListGraph &gh,int i)
{
	int nextNum = -1;
	if (visited[i])//如果该结点已经被访问则返回 
		return;
 
	//访问该结点
	cout << gh.adjList[i].data << " ";
	visited[i] = true;
 
	EdgeNode *tmp = gh.adjList[i].first;
    while (tmp)
	{
		nextNum = tmp->adjvex;
		if (visited[nextNum]==false)
		{
			DFS(gh, nextNum);
		}
	    tmp = tmp->next;
		
	}
	
}
 
//对所有顶点进行深度遍历
void DFS_All(AdjListGraph &gh)
{
	for (int i=0;i<gh.numVex;i++)
	{
		if (visited[i]==false)
		{
			DFS(gh, i);
		}
	}
}

🚀四、邻接表的广度遍历

⛳(一)广度优先遍历算法原理

首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点;

然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过,遍历结束。

在这里插入图片描述

⛳(二)广度优先遍历算法实现

//对图上的顶点进行广度遍历
void BFS(AdjListGraph &gh,int i)
{
	int cur = -1;
	queue<int> q;
	q.push(i);
	while (!q.empty())//队列不为空
	{
		cur = q.front();//取队列的头元素
		if (visited[cur]==false)
		{
			cout << gh.adjList[cur].data << " ";
			visited[cur] = true;
		
		}
		q.pop();
		//取当前结点相邻的结点入队
		EdgeNode *tmp = gh.adjList[cur].first;
		while (tmp!=NULL)
		{
			q.push(tmp->adjvex);
			tmp = tmp->next;
		}
	}
}
//对所有顶点进行广度遍历
void BFS_All(AdjListGraph &gh)
{
	for (int i = 0; i < gh.numVex; i++)
	{
		if (visited[i] == false)
		{
			BFS(gh, i);
		}
	}
}

程序清单

#include <iostream>
#include <queue>
#define MAXSIZE 1024
using namespace std;
 
typedef struct _EdgeNode//与结点连接的边 
{
	int adjvex;//邻接的顶点 
	int weight;//权重
	struct _EdgeNode *next;//指向下一个顶点/边
}EdgeNode;
 
typedef struct _VertexNode//顶点结点
{
	char data;//结点数据
	struct _EdgeNode *first;
}VertexNode,*AdjList;
 
typedef struct _AdJListGraph
{
	AdjList adjList;//顶点数组
	int numVex;
	int numEdg;
}AdjListGraph;
 
//图的初始化
bool Init(AdjListGraph &gh)
{
	gh.adjList = new VertexNode[MAXSIZE];//分配顶点数组地址
	if (!gh.adjList) return false;
 
	gh.numEdg = 0;
	gh.numVex = 0;
 
}
 
//寻找顶点的数据找到数组的下标
int Location(AdjListGraph gh, char c)
{
	if (gh.numVex <= 0) return -1;
 
	for (int i=0;i<gh.numVex;i++)
	{
		if (c==gh.adjList[i].data)
		{
			return i;
		}
	}
	
	return-1;
}
 
//图的创建
void CreateALGraph(AdjListGraph &gh)
{
	cout << "输入图的定点数 和边数:";
	cin >> gh.numVex >> gh.numEdg;
	if (gh.numVex > MAXSIZE) return;
 
	cout << endl << "输入相关顶点: " << endl;
	//保存顶点
	for (int i=0;i<gh.numVex;i++)
	{
		cin >> gh.adjList[i].data;
		gh.adjList[i].first = NULL;
	}
 
	char vi, vj;//保存输入的顶点;
	int i, j;
	cout << "请依次输入边(vi,vj)上的顶点序号:" << endl;
 
    for(int k = 0; k < gh.numEdg; k++)
	{
		cin >> vi >> vj;
		i = Location(gh, vi);
		j = Location(gh, vj);
 
		if (i>=0 && j>=0)
		{
			EdgeNode *temp = new EdgeNode;
			temp->adjvex = j;
			temp->next = gh.adjList[i].first;
			gh.adjList[i].first = temp;
		}
	}
}
 
bool visited[MAXSIZE] = {0};//全局数据用来判断元素是否被访问过
 
//对图上的顶点进行深度遍历
void DFS(AdjListGraph &gh,int i)
{
	int nextNum = -1;
	if (visited[i])//如果该结点已经被访问则返回 
		return;
 
	//访问该结点
	cout << gh.adjList[i].data << " ";
	visited[i] = true;
 
	EdgeNode *tmp = gh.adjList[i].first;
    while (tmp)
	{
		nextNum = tmp->adjvex;
		if (visited[nextNum]==false)
		{
			DFS(gh, nextNum);
		}
	    tmp = tmp->next;
	}
	
}
 
//对所有顶点进行深度遍历
void DFS_All(AdjListGraph &gh)
{
	for (int i=0;i<gh.numVex;i++)
	{
		if (visited[i]==false)
		{
			DFS(gh, i);
		}
	}
}
 
//对图上的顶点进行广度遍历
void BFS(AdjListGraph &gh,int i)
{
	int cur = -1;
	queue<int> q;
	q.push(i);
	while (!q.empty())//队列不为空
	{
		cur = q.front();//取队列的头元素
		if (visited[cur]==false)
		{
			cout << gh.adjList[cur].data << " ";
			visited[cur] = true;
		
		}
		q.pop();
		//取当前结点相邻的结点入队
		EdgeNode *tmp = gh.adjList[cur].first;
		while (tmp!=NULL)
		{
			q.push(tmp->adjvex);
			tmp = tmp->next;
		}
	}
}
//对所有顶点进行广度遍历
void BFS_All(AdjListGraph &gh)
{
	for (int i = 0; i < gh.numVex; i++)
	{
		if (visited[i] == false)
		{
			BFS(gh, i);
		}
	}
}
int main()
{
	
	AdjListGraph G;
	cout << "正在创建邻接表,请按提示进行输入..." << endl;
    Init(G);
	CreateALGraph(G);
 
	cout << "正在进行深度优先遍历,遍历结果如下:" << endl;
	
 
	//深度优先遍历
	DFS_All(G);
	cout << endl;
 
	memset(visited, 0, sizeof(visited));
 
	cout << "正在进行广度优先遍历,遍历结果如下:" << endl;
	//广度优先遍历
	BFS_All(G);
 
	cout << endl;
}

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

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

相关文章

第133页的gtk+编程例子——计算器应用改写网上的例子用gtk4编译

第133页的gtk编程例子——计算器应用改写网上的例子用gtk4编译 来源&#xff1a;《GTK的计算器》 https://blog.csdn.net/zhouzhouzf/article/details/17097999 例子程序是在gtk2.0编译的&#xff0c;之前修改许多地方才能在gtk3.0编译通过&#xff0c;如今再修改能在gtk4编译…

如何在C#中处理空值

在任何编程语言中开发应用程序时&#xff0c;经常会遇到空异常或空引用异常。空指针或空引用是指不引用有效的内存位置或对象的指针。这是一个困扰程序员已经很久的问题&#xff0c;自从程序员开始编写程序以来。空值是一个特殊的值&#xff0c;表示没有有效值可用。当将空值赋…

Appium+python自动化(二十六)- Toast提示(超详解)简介

开始今天的主题 - 获取toast提示 在日常使用App过程中&#xff0c;经常会看到App界面有一些弹窗提示&#xff08;如下图所示&#xff09;这些提示元素出现后等待3秒左右就会自动消失&#xff0c;这个和我日常生活中看到的烟花和昙花是多么的相似&#xff0c;那么我们该如何获取…

数据分析-关于指标和指标体系

一、电商指标体系 二、指标体系的作用 三、统计学中基本的分析手段

从头学前端-CSS3提升-续

CSS3 2D转换 关键字&#xff1a;transform 移动&#xff1a;沿着x,y轴移动&#xff0c;不会影响盒子的位置&#xff0c;对行内元素没有效果 div {width: 100px;height: 100px;background-color: rebeccapurple;transform: translate(100px,100px);transform: translateX(100p…

centos下安装ftp-读取目录列表失败-

1.下载安装ftp服务器端和客户端 #1.安装yum -y install vsftpdyum -y install ftp #2.修改配置文件vim /etc/vsftpd.conflocal_enablesYESwrite_enableYESanonymous_enableYESanon_mkdir_write_enableYES //允许匿名用户在FTP上创建目录anon_upload_enableYES //允许匿名用户…

【Java|golang】2500. 删除每行中的最大值

给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。 将删除元素中的最大值与答案相加。 注意 每执行一次操作&#…

KY222 打印日期+KY111日期差值

一、KY222题目 二、代码 #include <climits> #include <iostream> using namespace std; class Date{public:Date(int year 1,int month 2,int day 3){_year year;_month month;_day day;}int GetDay(int year ,int month);void Define(int n);public:int _yea…

【Unity2D】粒子特效

为什么要使用粒子特效 Unity 的粒子系统是一种非常强大的工具&#xff0c;可以用来创建各种各样的游戏特效&#xff0c;如火焰、烟雾、水流、爆炸等等。使用粒子特效可以使一些游戏动画更加真实或者使游戏效果更加丰富。 粒子特效的使用 在Hierarchy界面右键添加Effects->…

【分布式系统】分布式系统的8个谬误

网络可靠 对于分布式系统来说&#xff0c;网络、计算、存储是三大基石&#xff0c;系统之间进行拆分隔离之后&#xff0c;那么必定存在网络通讯&#xff0c;而网络是最不可靠的。 不管是从硬件层面还是软件层面来说&#xff0c;网络是不可靠的。&#xff08;断电、配置错误、ID…

基于FPGA的VGG16卷积神经网络加速器--WL

VGG16是一个典型的卷积神经网络&#xff0c;由13层卷积层&#xff0c;5层池化层和3层全连接层组成。且卷积层的计算时间在整个计算过程中占比极大&#xff0c;通过FPGA的并行运算可以有效的加快卷积层的计算速度。 一个卷积层可以有若干个卷积核&#xff0c;以第一层为例&#…

go学习 3、基础数据类型

3、基础数据类型 基础数据类型&#xff1a;数字、字符串、布尔型复合类型&#xff1a;数组、结构体引用类型&#xff1a;指针、切片、字典、函数、通道接口类型 3.1 整型 有符号、无符号 int8/int16/int32/int64 uint8/uint16/uint32/units 64 Unicode字符rune类型是和int32…

使用Spring Boot AOP实现日志记录

目录 介绍 1.1 什么是AOP 1.2 AOP体系与概念 AOP简单实现 2.1 新建一个SpringBoot项目&#xff0c;无需选择依赖 2.2 设置好本地Maven配置后&#xff0c;在pom.xml文件里添加添加maven依赖 2.3 创建一个业务类接口 2.4 在实体类实现接口业务 2.5 在单元测试运行结果 …

python中的单引号、双引号和多引号

目录 python中的单引号 python中的双引号 python中的多引号 三者分别在什么时候使用&#xff0c;有什么区别 总结 python中的单引号 在Python中&#xff0c;单引号&#xff08;&#xff09;可以用来表示字符串。 可以使用单引号创建一个简单的字符串&#xff0c;例如&…

第1章 JavaScript简史

JavaScript的起源 JavaScript是Netscape公司与Sun公司合作开发的在JavaScript诞生之前游览器就是显示超文本文档的简单的软件&#xff0c;JavaScript为此增加了交互行为ECMAScript是JavaScript的标准化&#xff0c;本质上是同一个语言JavaScript是一门脚本语言通常只能运行在游…

仿VScode MDK背景配色方案

效果如果所示 操作方法&#xff1a;备份后修改~/UV4文件夹下的global.prop&#xff0c;用以下的代码代替。 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page936 caretline.visible1 highlight.matchingbraces1…

【数据结构】队列(Queue)的实现 -- 详解

一、队列的概念及结构 1、概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out)。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的…

当ChatGPT应用在汽车行业,具体有哪些场景?

​ ChatGPT有潜力彻底改变汽车行业并将其提升到新的高度。在ChatGPT的加持下&#xff0c;该行业的多个领域都将取得重大变化。 利用ChatGPT作更高级的虚拟助理 你可能用过现有的虚拟助理&#xff0c;它们一系列的回复有时候让人不得不感叹一句“人工智障”&#xff01;然而&a…

Android Glide预处理preload原始图片到成品resource 预加载RecyclerViewPreloader,Kotlin

Android Glide预处理preload原始图片到成品resource & 预加载RecyclerViewPreloader&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MED…

RT1052的定时器

文章目录 1 通用定时器1.1 定时器框图1.2 实现周期性中断 2 相关寄存器3 定时器配置3.1 时钟使能3.2 初始化GPT1定时器3.2.1 base3.2.2 initConfig3.2.2.1 clockSorce3.2.2.2 divider3.2.2.3 enablexxxxx 3.3 设置 GPT1 比较值3.3.1 base3.3.2 channel3.3.3 value 3.4 设置 GPT…