10-数据结构-队列(C语言)
队列
目录
目录
队列
一、队列基础知识
二、队列的基本操作
1.顺序存储
编辑 (1)顺序存储
(2)初始化及队空队满
(3)入队
(4)出队
(5)打印队列
(6)循环队列
(7)顺序可运行总代码:
2.链式存储
(1)链式存储定义
(2)初始化
(3)进队
(4)出队
(5)打印链队
(6)链队可运行总代码
3.双端队列。
(1)输入受限的双端队列
(2)输出受限的双端队列
(3)例题:
一、队列基础知识
简介:队列是一种先进先出(FIFO)的线性数据结构,是一种只允许在一端进行插入操作(队尾),在另一端进行删除操作的数据结构(队头)。插入操作在队列的末尾进行,删除操作在队列的前端进行,即队头元素先出队,后插入的元素排在队尾。
队列是一种广泛应用于计算机科学领域的数据结构,常用于实现消息队列、任务队列、缓冲队列等。在算法设计中,队列可以用于广度优先搜索(BFS)、模拟银行排队等问题。同时,队列还常与栈结构搭配使用,实现更复杂的算法和数据结构。
二、队列的基本操作
简介:队列可以使用数组或链表实现。常见的队列操作包括:入队(enqueue)、出队(dequeue)、获取队头元素(front)、获取队列长度(size)等。
1.顺序存储
简介:就是数组+两个标记队头和队尾的变量,构成的结构体。
优点:简单易实现。
缺点:容易出现假溢出问题(队列未满时,向队列尾插入元素却因为队列头指针没有移动而导致队列满的情况)。
(1)顺序存储
即一个一维数组和两个标记队头和队尾的变量。
代码如下:
//队列的顺序存储
#define MaxSize 10
typedef struct
{int data[MaxSize];int front;int rear;// int count;//记录队列中实际元素个数,可先不用
}SqQueue;
(2)初始化及队空队满
初始化:
//队列初始化
void QueueInit(SqQueue *q)
{q->front=0; q->rear=0;
}
队空:当队头和队尾相等的时候便为空。不仅仅限制于都等0,因为两个变量都在一直变化。
//队空
bool QueueEmpty(SqQueue *q)
{if(q->front == q->rear )return true;
}
队满:这里面队满不好判定,当rear>MaxSize-1时,会出现假溢出现象,不算队满。不过可以在队列顺序存储时结构体里面加一个计时器,出队一次,count--,入队一次count++,当count==MaxSize-1时,队满。
typedef struct
{int data[MaxSize];int front;int rear;int count;
}SqQueue;
//队满
bool QueueFull(SqQueue *q)
{if(q->count == MaxSize-1)return true;
}
(3)入队
从队尾rear处进行遍历,入队赋值。随后rear+1,后撤。
//入队
void EnQueue(SqQueue *q,int x)
{//如果队满了 if(QueueFull(q)==false)exit(-1);//给队尾处赋值 q->data[q->rear]=x;//移动队尾标记 q->rear++;//数据数+1; q->count++;
}
(4)出队
//出队
void OutQueue(SqQueue *q,int *e)
{//判断非法情况,是否为空 if(q->front == q->rear)exit(-1);//取出队头元素,赋值给e *e=q->data[q->front];//队头指针++ q->front++;//元素个数-1; q->count--;
}
(5)打印队列
void QueuePrint(SqQueue *q)
{int i=0;printf("目前队列中有%d个数据\n",q->count);//从队头遍历到队尾 for(i=q->front;i<q->rear;i++){printf("%d ",q->data[i]); }printf("\n");
}
(6)循环队列
简介:由于普通的顺序存储队列,存在假溢出现象,导致出队后,出现的空缺,没法补上,这时候循环队列就出手了。它则是多了个取余操作,每次模数组最大值,给溢出的数字,控制在最大值之内,达到循环,形成了一个环。
即每一次标记队头和队尾遍历,变换时,变为了q->front=(q->front+1)%MaxSize;q->rear=(q->rear+1)%MaxSize;
此外,循环队列,在判断队满时,一般两种操作:
一个是牺牲最后一个格子,当rear+1=front时,此时队满。
另一个操作则是:像我最开头,在结构体定义里面加一个记录实际数据的计数器,每次出队入队,计数器进行相应的加减。当计数器等于MaxSize时,队满。
此外,循环队列的长度计算为:[MaxSize-(q->rear - q->front)]%MaxSize;但如果,之前在结构体里面加了一个计数器,则直接打印计数器即可。
下面时循环队列的操作。
入队:(只不过比之前入队,多了一个判断队满的判断,以及移动队尾指针时取余)
void CycEnQueue(SqQueue *q,int x)
{//如果队满了 if(QueueFull(q)==1) //可以在结构体中加个计数器exit(-1);//if(q->rear+1 == q->front) //也可以牺牲一个存储单元,用来判断队满// exit(-1);//给队尾处赋值 q->data[q->rear]=x;//移动队尾标记 q->rear=(q->rear+1)%MaxSize;//数据数+1; q->count++;
}
出队:
void CycOutQueue(SqQueue *q,int *e)
{//判断非法情况,是否为空 if(q->front == q->rear)exit(-1);//取出队头元素,赋值给e *e=q->data[q->front];//队头指针++ q->front=(q->front+1)%MaxSize;//元素个数-1; q->count--;
}
(7)顺序可运行总代码:
#include <stdio.h>
#include <stdlib.h>
//队列
//队列的顺序存储
#define MaxSize 10
typedef struct
{int data[MaxSize];int front;int rear;//计数器 int count;
}SqQueue;
//队列初始化
void QueueInit(SqQueue *q)
{q->front=0; q->rear=0;q->count=0;
}
//队空
int QueueEmpty(SqQueue *q)
{if(q->front == q->rear )return 1;
}
//队满
int QueueFull(SqQueue *q)
{if(q->count == MaxSize-1)return 1;elsereturn -1;
}
//入队
void EnQueue(SqQueue *q,int x)
{//如果队满了 if(QueueFull(q)==1)exit(-1);//给队尾处赋值 q->data[q->rear]=x;//移动队尾标记 q->rear++;//数据数+1; q->count++;
}
void CycEnQueue(SqQueue *q,int x)
{//如果队满了 if(q->rear+1 == q->front)exit(-1);//给队尾处赋值 q->data[q->rear]=x;//移动队尾标记 q->rear=(q->rear+1)%MaxSize;//数据数+1; q->count++;
}
//出队
void OutQueue(SqQueue *q,int *e)
{//判断非法情况,是否为空 if(q->front == q->rear)exit(-1);//取出队头元素,赋值给e *e=q->data[q->front];//队头指针++ q->front++;//元素个数-1; q->count--;
}
void CycOutQueue(SqQueue *q,int *e)
{//判断非法情况,是否为空 if(q->front == q->rear)exit(-1);//取出队头元素,赋值给e *e=q->data[q->front];//队头指针++ q->front=(q->front+1)%MaxSize;//元素个数-1; q->count--;
}
//打印队列
void QueuePrint(SqQueue *q)
{int i=0;printf("目前队列中有%d个数据\n",q->count);//从队头遍历到队尾 for(i=q->front;i<q->rear;i++){printf("%d ",q->data[i]); }printf("\n");
} //队列的链式存储 int main()
{//创建队列 SqQueue q;//初始化队列 QueueInit(&q);//打印队列 QueuePrint(&q);//入队 EnQueue(&q,0); EnQueue(&q,1); EnQueue(&q,2); EnQueue(&q,3); QueuePrint(&q);//出队 int e=0;OutQueue(&q,&e);QueuePrint(&q);printf("出队%d\n",e);return 0;
}
2.链式存储
简介:使用链表数据结构实现,每个节点都包含一个元素和指向下一个节点的指针。
链表队列的优点:可以动态地调整队列长度。
链表队列的缺点:需要更多的内存空间存储指针信息。另外,由于需要动态申请和释放内存,链表实现的队列在操作上比数组实现的队列稍慢
(1)链式存储定义
简介:由单链表构成,然后由队头指针和队尾指针,进行操作,因此定义两个结构体,一个结构体是定义队列结点类型的,一个则是封装队头,队尾指针。
/链队结点
typedef struct Linknode
{int data;struct Linknode* next;
}LinkNode;
//链队的头指针和尾指针
typedef struct
{LinkNode* front;LinkNode* rear;
}LinkQueue;
(2)初始化
这里面初始化,默认带头节点,就是为了是开头操作和其他情况操作一致。
/链队初始化
void InitQueue(LinkQueue* q)
{//创建头节点LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)exit(-1);else{s->next = NULL;q->front = q->rear = s;q->rear->next = NULL;}//return q;
}
初始化的时候,头节点定义完后,队头指针和队尾指针都指向它,并且队尾指针的指针域指向空。
(3)进队
进队时,也是先定义一个队列结点,用来加入队。随后用队尾指针进行相关操作。先连接结点,再更新队尾指针。
//入队
void EnQueue(LinkQueue* q, int x)
{//创建结点LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)exit(-1);else{s->data = x;s->next = NULL;//队尾所指向的结点的指针域,指向存储s结点地址q->rear->next = s;//更新尾指针q->rear = s;}}
(4)出队
出队时,先判断是否为空队,随后,再进行出队操作,出队时,先定义一个指针,指向需要出队的元素,因为这里由头节点,而队头指针始终指向头节点,因此标记出队元素指针为队头指针的指针域,即头节点的后继节点为实际出队结点。随后头节点的指针域,指向出队结点的后继,并判断,当前出队的元素是否为最后一个结点,即如果q->rear = p,则让队内初始化为空,即队头指针和队尾指针相等。随后释放掉P结点。
//出队
void DeQueue(LinkQueue* q, int* e)
{//判断非法情况,空队 if (q->front == q->rear)exit(-1);//给出队元素赋值 *e = q->front->next->data;//标记出队元素 LinkNode* p = q->front->next;//队头指针后移到出队元素后继节点 q->front->next = p->next;//判断是否仅有一个结点 if (q->rear == p){q->rear = q->front;}free(p);//return q;
}
(5)打印链队
定义一个工作指针,
工作指针,从实际第一个元素结点开始,即头节点的后继节点。
void LinkQueuePrint(LinkQueue* q)
{LinkNode* pos = q->front->next;//队头元素指向头节点int i = 0;while (pos !=NULL){printf("%d->", pos->data);pos = pos->next;}printf("NULL\n");
}
(6)链队可运行总代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//链队结点
typedef struct Linknode
{int data;struct Linknode* next;
}LinkNode;
//链队的头指针和尾指针
typedef struct
{LinkNode* front;LinkNode* rear;
}LinkQueue;
//链队初始化
void InitQueue(LinkQueue* q)
{//创建头节点LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)exit(-1);else{s->next = NULL;q->front = q->rear = s;q->rear->next = NULL;}//return q;
}
//入队
void EnQueue(LinkQueue* q, int x)
{//创建结点LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));if (s == NULL)exit(-1);else{s->data = x;s->next = NULL;//队尾所指向的结点的指针域,指向存储s结点地址q->rear->next = s;//更新尾指针q->rear = s;}//return q;
}
//出队
void DeQueue(LinkQueue* q, int* e)
{//判断非法情况,空队 if (q->front == q->rear)exit(-1);//给出队元素赋值 *e = q->front->next->data;//标记出队元素 LinkNode* p = q->front->next;//队头指针后移到出队元素后继节点 q->front->next = p->next;//判断是否仅有一个结点 if (q->rear == p){q->rear = q->front;}free(p);//return q;
}
void LinkQueuePrint(LinkQueue* q)
{LinkNode* pos = q->front->next;//队头元素指向头节点int i = 0;while (pos !=NULL){printf("%d->", pos->data);pos = pos->next;}printf("NULL\n");
}
int main()
{LinkQueue q ;InitQueue(&q);EnQueue(&q, 0);EnQueue(&q, 1);EnQueue(&q, 2);EnQueue(&q, 3);LinkQueuePrint(&q);int e = 0;DeQueue(&q, &e);printf("e=%d\n", e);LinkQueuePrint(&q);DeQueue(&q, &e);printf("e=%d\n", e);LinkQueuePrint(&q);return 0;
}
3.双端队列。
这一部分了解思想即可,主要用于计算选择和填空。
简介:
双端队列(Double-ended Queue)是一种特殊的队列,它允许在队列两端进行插入和删除操作。双端队列可以看作是两个栈首尾相接构成的数据结构。在双端队列中,可以在队列头部和尾部进行元素的插入和删除操作,因此它的操作有:从队头插入元素、从队头删除元素、从队尾插入元素、从队尾删除元素等。
双端队列可以用数组或链表实现。在数组中实现时,需要注意队列头部和尾部指针的位置。当队列长度大于数组长度时,需要进行扩容操作。在链表中实现时,只需要维护头结点和尾结点即可。
双端队列的应用非常广泛,比如操作系统中的进程调度队列、窗口滑动中的数据缓存等场景都可以使用双端队列来实现。
说白了,就是再原来队列的基础上,多了好几个功能,即两端都可以进行入队和出队操作。
之后,便引申出了一个题型。输入受限的双端队列,输出受限的双端队列。
(1)输入受限的双端队列
即一段仅能输出,另一端输入输出都可以,就是仅能输出那一段,不能输入,就是输入受限。
这里记住一个技巧:若1234为入队序列,那么输入受限的话,有这样公式:..1..2..3..4,即先先出4的话,2就不能紧跟着出。因为2位于1 3中间。这种技巧是可以得到不可能得到的序列
(2)输出受限的双端队列
即一段仅能输入,另一端不限制,就是仅能输入那一段,不能输出,就是输出受限。
技巧:若1234入队序列,那么有这样公式:12...3..4,这时4输出了,那么3一定不会12之间,因为12是紧挨着的。这种技巧是可以得到不可能得到的序列
(3)例题:
有一双端队列,输入序列为1,2,3,4,分别求出一下条件的输出序列:
1.能由输入受限得到,输出得不到。
2.能由输出受限得到,输入得不到。
3.输入输出都得不到,
解:应用题的话,需要一个个证明,有些多,我觉得一般都是选择和填空,因此我们采用技巧取做。
技巧可以得到输入受限不可能得到的序列,和输出受限不可能得到的序列,随后我们让这两个求差集,即可。
输入受限得不到:
规律:..1..2..3..4,那么4先出,则2一定不会紧跟着出来,
所以不可能得到的为:4,2,1,3 和 4,2,3,1
输出受限得不到的:
规律:12...3..4,那么4先出。则3一定不会再12中间,因为12是紧邻着的,
所以不可能得到的为:4,1,3,2 和 4,2,3,1
随后我们根据条件去筛选即可。
(1)输入得到,输出得不到。 我们从输出得不到的里面,去筛选,输入可以得到的,
所以为4,1,3,2,因为4,2,3,1在输入受限中也得不到,所以排除。
(2)输出得到,输入得不到:我们从输入得不到的里面,去筛选,输出可以得到的,所以为:
4,2,1,3,因为4,2,3,1输出也得不到,所以排除。
(3)输入输出都得不到:因此我们,找这俩的交集,所以为:4,2,3,1
至此队列基本理论结束!以后记得常来复习。基本操作要滚瓜烂熟,先明白整体,再去记忆具体。
相关文章:
10-数据结构-队列(C语言)
队列 目录 目录 队列 一、队列基础知识 二、队列的基本操作 1.顺序存储 编辑 (1)顺序存储 (2)初始化及队空队满 (3)入队 (4)出队 (5)打印队列 &…...
面试之快速学习C++11 - 右值 移动构造 std::move
C11右值引用 字面意思,以引用传递的方式使用c右值左值和右值,左值是lvalue loactor value 存储在内存中,有明确存储地址的数据, 右值rvalue read value , 指的是那些可以提供数据值的数据(不一定可以寻址,…...
vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色
vue实现5*5宫格当鼠标滑过选中的正方形背景颜色统一变色 1、实现的效果 2、完整代码展示 <template><div id"app" mouseleave"handleMouseLeave({row: 0, col: 0 })"><div v-for"rowItem in squareNumber" :key"rowItem…...
2023-08-09 LeetCode每日一题(整数的各位积和之差)
2023-08-09每日一题 一、题目编号 1281. 整数的各位积和之差二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例1: 示例2: 提示: 1 …...
EditPlus连接Linux系统远程操作文件
EditPlus是一套功能强大的文本编辑器! 1.File ->FTP->FTP Settings; 2.Add->Description->FTP server->Username->Password->Subdirectory->Advanced Options 注意:这里的Subdirectory设置的是以后上传文件的默认…...
JVM 垃圾回收
垃圾回收算法 标记-清除算法(Mark and Sweep) 标记-清除算法分为两个阶段。在标记阶段,垃圾收集器会标记所有活动对象;在清除阶段,垃圾收集器会清除所有未标记的对象。标记-清除算法存在的问题是会产生内存碎片&#…...
编程中的宝藏:二分查找
二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字(虽然现在谁还在用电话簿呢!)。你可以从头开始翻页,直到进入以 “K” 打头的部分。然而,更明智的方法是从中间开始,因为你知道以 “K” 打头…...
计算机网络 数据链路层
...
如何维护自己的电脑
目录 1、关于电脑选择的建议 1.1、价格预算 1.2、明确需求 1.3、电脑配置 1.4、分辨率 1.5、续航能力 1.6、品牌选择 1.7、用户评测 1.8、各个电商平台对比 1.9、最后决策 2、我的选择 3、电脑保养 3.1 外部清洁 3.2 安装软件 3.3 优化操作系统 3.4 维护硬件设…...
智能优化算法——哈里鹰算法(Matlab实现)
目录 1 算法简介 2 算法数学模型 2.1.全局探索阶段 2.2 过渡阶段 2.3.局部开采阶段 3 求解步骤与程序框图 3.1 步骤 3.2 程序框图 4 matlab代码及结果 4.1 代码 4.2 结果 1 算法简介 哈里斯鹰算法(Harris Hawks Optimization,HHO),是由Ali As…...
【深度学习】多粒度、多尺度、多源融合和多模态融合的区别
多粒度(multiresolution)和多尺度(multiscale) 多粒度(multiresolution)和多尺度(multiscale)都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度࿱…...
利用SCCM进行横向移动
01SCCM介绍 SCCM全名为System Center Configuration Manager,从版本1910开始,微软官方将其从Microsoft System Center产品移除,重新命名为Microsoft Endpoint Configuration Manager(ConfigMgr),其可帮助 …...
Nginx 负载均衡
Nginx 负载均衡 负载均衡由反向代理来实现的 其中反向代理分为七层代理和四层代理,一般常用的是七层代理,接下来分别介绍一些 NGINX 七层代理 七层是最常用的反向代理方式,只能配置在Nginx配置文件的http模块。 配置方法名称:…...
Java课题笔记~ ServletConfig
概念:代表整个web应用,可以和程序的容器(服务器)来通信 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://java.sun.com/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…...
oracle的异常处理
oracle提供了预定义例外、非预定义例外和自定义例外三种类型。其中: l预定义例外用于处理常见的oracle错误; l非预定义例外用于处理预定义所不能处理的oracle错误; l自定义例外处理与oracle错误无关的其他情况。 Oracle代码编写过程中&am…...
【MySQL】MySQL数据类型
文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…...
【数据结构与算法】十大经典排序算法-希尔排序
🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…...
docker 常用命令
1. 搜索并下载镜像 docker search bundlefusion # 搜索docker pull jhljx/bundlefusion # 将远程仓库文件下载到本地2. 用镜像创建容器 docker run -it --namebundlefusion colec777/bundlefusion-cu11.4-cudagl:v8 /bin/bash # 创建并运行 exit # 退出终端 sudo docker cont…...
uniapp微信小程序中打开腾讯地图获取用户位置信息
实现的效果 第一步:首先登录微信公众平台 , 需要用到AppID 第二步: 注册登录腾讯位置服务 注册需要手机号和邮箱确认,然后创建应用 创建后点击添加key 添加后会生成key,后面会用到这个key 第三步: 登录微信公众平台&a…...
嵌入式领域:人才供需失衡,发展潜力巨大
嵌入式技术正快速发展,ARM处理器、嵌入式操作系统、LINUX等技术助力嵌入式领域崛起。然而,行业新颖且门槛高,缺乏专业指导。因此,嵌入式人才稀缺,身价水涨船高。 未来几年,嵌入式系统将在信息化、智能化、…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
