队列的实现(附含两道经典例题)

news/2024/5/16 10:34:35/文章来源:https://blog.csdn.net/qq_65662221/article/details/130743423

🍉文章主页:阿博历练记
📖文章专栏:数据结构与算法
🚍代码仓库:阿博编程日记
🍥欢迎关注:欢迎友友们点赞收藏+关注哦🌹

在这里插入图片描述

文章目录

    • 🌾前言
    • 🎬队列
      • 🔍1.队列的结构框架
      • 🔍2.队列的初始化
      • 👑为什么初始化不使用二级指针
      • 🔍3.队列的释放
      • 🔍4.队列的插入数据
      • 🔍5.队列的删除数据
      • 🔍6.队列取队头数据
      • 🔍7.队列取队尾数据
      • 🔍8.返回队列数据的个数
      • 🔍9.判断队列是否为空
      • 🚀Queue.h代码
      • 🛸Queue.c代码
      • 🛳Test.c代码
      • 🧋代码效果展示
      • 1.🖋题目描述
      • 💡逻辑分析
      • 🎥代码实现
      • 2.🖋题目描述
      • 💡逻辑分析
      • 🎥代码实现

🌾前言

友友们,上期阿博给大家介绍了栈的实现,今天阿博给大家介绍一种新的数据结构:队列.
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的性质。
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
在这里插入图片描述
队列也可以使用数组链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低.
在这里插入图片描述
在这里插入图片描述

🎬队列

🔍1.队列的结构框架

typedef  int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType  data;
}QNode;
typedef struct  Queue
{QNode* phead;QNode* ptail;int  size;
}Queue;

⛳⛳友友们注意,这两个结构体不能合并到一起,因为它们所代表的意义不一样,第一个结构体是每一个结点的结构,第二个结构体代表的是这个队列的结构,它表示的是队列整体.

🔍2.队列的初始化

void  QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}

👑为什么初始化不使用二级指针

⛳⛳这里有可能友友们会有疑问,我们初始化不是要改变phead指针和ptail指针,它们两个都是结构体指针,我们要改变它们,为什么不用二级指针呢?这里友友们注意了,phead指针和ptail指针又在一个新的结构体Queue里面放着,它们就属于这个结构体里面的成员,我们要改变它,只需要传这个新结构体的地址就可以访问并改变它们了.
这里阿博给友友们总结几种不用二级指针的方法:
⭐1.我们在函数外部定义一个同类型的指针,通过返回值的方式接收,这本质上是一个值拷贝(赋值)
⭐2.带哨兵位的头结点,它的本质是改变结构体里面的next指针,next指针属于结构体的成员,所以我们只需要传结构体的指针就可以访问到它了.
⭐3.把结构体指针重新放在一个结构体里面,这样它就属于这个结构体的成员了,我们只需要传这个结构体的地址就可以改变结构体指针了.

🔍3.队列的释放

1.保存下一结点的地址迭代释放

void  QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}

2.保存当前结点的地址迭代释放

void  QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* del = cur;cur = cur->next;free(del);}pq->phead = pq->ptail = NULL;pq->size = 0;
}

🚩🚩友友们,这里要注意两个点:⭐1.如果保存当前结点的地址的话,我们就需要先让cur=cur->next往后迭代,然后在释放保留的那个地址,如果先释放的话,那么cur=cur->next这一步就会报错,此时cur已经被释放了,我们还在使用,它就是一个野指针.⭐2.如果保留下一结点地址的话,我们就需要先释放当前结点,在让cur=next往后进行迭代,如果我们先往后迭代的话,此时cur=next已经指向下一结点了,我们在把它释放,这样就会导致上一个结点没有释放和下次再使用cur就是野指针.🌈🌈

🔍4.队列的插入数据

void  QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){assert(pq->ptail == NULL);pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}

⛳⛳友友们注意,就算这里是首次插入数据,我们也不需要二级指针因为phead和ptail指针都在结构体里面放着,所以我们传这个结构体的指针就可以改变它们.

🔍5.队列的删除数据

错误案例

void  QueuePop(Queue* pq)
{assert(pq);QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;pq->size--;
}	

在这里插入图片描述
代码纠正

void  QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//1个结点if (pq->phead->next == NULL){free(pq->phead);pq->phead =pq->ptail= NULL;     //不能对同一动态开辟出来的空间进行多次free释放,这里我们释放完pq->phead之后,pq->ptail也已经被释放了,所以我们主要的目的就是把pq->phead和pq->ptail都置空}//多个结点else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}

⛳⛳友友们注意,pq->phead和pq->ptail指向相同的结点,free(pq->phead)之后就已经把这块内存空间释放了,此时我们就不能再free(pq->ptail)了,因为动态开辟出来的空间不能进行多次free释放.

🔍6.队列取队头数据

QDataType  QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->phead->data;
}

这里我们需要断言队列不能为空,如果为空,pq->phead就是空指针,这时pq->phead->data就是对空指针的解引用,程序就会报错.

🔍7.队列取队尾数据

QDataType  QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->ptail->data;
}

🔍8.返回队列数据的个数

int   QueueSize(Queue* pq)
{assert(pq);return  pq->size;
}

🔍9.判断队列是否为空

bool  QueueEmpty(Queue* pq)
{assert(pq);return  pq->phead == NULL&&  pq->ptail == NULL;
}

🚀Queue.h代码

#pragma once
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef  int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType  data;
}QNode;
typedef struct  Queue
{QNode* phead;QNode* ptail;int  size;
}Queue;
void  QueueInit(Queue*pq);
void  QueueDestroy(Queue* pq);
void  QueuePush(Queue* pq, QDataType x);
void  QueuePop(Queue* pq);
QDataType  QueueFront(Queue* pq);
QDataType  QueueBack(Queue* pq);
int   QueueSize(Queue* pq);
bool  QueueEmpty(Queue* pq);

🛸Queue.c代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
void  QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
void  QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;/*QNode* del = cur;cur = cur->next;free(del);*/}pq->phead = pq->ptail = NULL;pq->size = 0;
}
void  QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){assert(pq->ptail == NULL);pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
void  QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//1个结点if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail=NULL;     //不能对同一动态开辟出来的空间进行多次free释放,这里我们释放完pq->phead之后,pq->ptail也已经被释放了,所以我们主要的目的就是把pq->phead和pq->ptail都置空}//多个结点else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
QDataType  QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->phead->data;
}
QDataType  QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->ptail->data;
}
int   QueueSize(Queue* pq)
{assert(pq);return  pq->size;
}
bool  QueueEmpty(Queue* pq)
{assert(pq);return  pq->phead == NULL&&  pq->ptail == NULL;
}

🛳Test.c代码

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"
#include<stdio.h>
TestQueue()
{Queue  q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}QueueDestroy(&q);return  0;
}
int main()
{TestQueue();return  0;
}

🧋代码效果展示

在这里插入图片描述

1.🖋题目描述

在这里插入图片描述

💡逻辑分析

在这里插入图片描述

友友们,通过这里也可以看出我们的入栈顺序是1,2,3,我们的出栈顺序也是1,2,3.

🎥代码实现

typedef  int  STDataType;
typedef struct  Stack
{STDataType* a;int top;                    //top指向栈顶的位置int capacity;
}ST;void  STInit(ST* pst);
void  STDestroy(ST* pst);
void  STPush(ST* pst,STDataType x);
STDataType  STTop(ST* pst);
void  STPop(ST* pst);
bool  STEmpty(ST* pst);
int   STSize(ST* pst);void  STInit(ST* pst)
{assert(pst);pst->a = NULL;pst->top = 0;    //如果我们初始化为0,top就指向栈顶元素的下一个位置,初始化为-1,top就是指向栈顶元素.pst->capacity = 0;
}
void  STDestroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}
void  STPush(ST* pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity= pst->capacity==0 ? 4 : pst->capacity * 2 ;STDataType* tmp = (STDataType*)realloc(pst->a,newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;} pst->a[pst->top] = x;pst->top++;
}
STDataType  STTop(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[pst->top - 1];
}
bool  STEmpty(ST* pst)
{assert(pst);return  pst->top == 0;
}
void  STPop(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}
int   STSize(ST* pst)
{assert(pst);return   pst->top;
}typedef struct {ST  pushst;ST  popst;
} MyQueue;MyQueue* myQueueCreate() {MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));if(obj==NULL){perror("malloc fail");return;}STInit(&obj->pushst);STInit(&obj->popst);return   obj;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->pushst,x);
}int myQueuePop(MyQueue* obj) {int  front=myQueuePeek(obj);STPop(&obj->popst);return  front;
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)){while(!STEmpty(&obj->pushst)){STPush(&obj->popst,STTop(&obj->pushst));STPop(&obj->pushst);}}return  STTop(&obj->popst);
}bool myQueueEmpty(MyQueue* obj) {
return  (STEmpty(&obj->pushst))&&(STEmpty(&obj->popst));
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->popst);STDestroy(&obj->pushst);free(obj);
}

2.🖋题目描述

在这里插入图片描述

💡逻辑分析

在这里插入图片描述

🎥代码实现

typedef  int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType  data;
}QNode;
typedef struct  Queue
{QNode* phead;QNode* ptail;int  size;
}Queue;
void  QueueInit(Queue*pq);
void  QueueDestroy(Queue* pq);
void  QueuePush(Queue* pq, QDataType x);
void  QueuePop(Queue* pq);
QDataType  QueueFront(Queue* pq);
QDataType  QueueBack(Queue* pq);
int   QueueSize(Queue* pq);
bool  QueueEmpty(Queue* pq);
void  QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}
void  QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;/*QNode* del = cur;cur = cur->next;free(del);*/}pq->phead = pq->ptail = NULL;pq->size = 0;
}
void  QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){assert(pq->ptail == NULL);pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
void  QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//1个结点if (pq->phead->next == NULL){free(pq->phead);pq->phead =pq->ptail= NULL;     //不能对同一动态开辟出来的空间进行多次free释放,这里我们释放完pq->phead之后,pq->ptail也已经被释放了,所以我们主要的目的就是把pq->phead和pq->ptail都置空}//多个结点else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
QDataType  QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->phead->data;
}
QDataType  QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return  pq->ptail->data;
}
int   QueueSize(Queue* pq)
{assert(pq);return  pq->size;
}
bool  QueueEmpty(Queue* pq)
{assert(pq);return  pq->phead == NULL&&  pq->ptail == NULL;
}typedef struct {Queue  p;Queue  q;
} MyStack;MyStack* myStackCreate() {MyStack*obj=(MyStack*)malloc(sizeof(MyStack));if(obj==NULL){perror("malloc fail");return;}QueueInit(&obj->p);QueueInit(&obj->q);return  obj;
}void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q)){QueuePush(&obj->q,x);}else{QueuePush(&obj->p,x);}
}int myStackPop(MyStack* obj) {Queue* NoFull=&obj->p;Queue*  Full=&obj->q;if(QueueEmpty(&obj->p)){Full=&obj->p;NoFull=&obj->q;}while(QueueSize(NoFull)>1){QueuePush(Full,QueueFront(NoFull));QueuePop(NoFull);}int top=QueueBack(NoFull);QueuePop(NoFull);return  top;
}int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->p)){return  QueueBack(&obj->p);}else{return  QueueBack(&obj->q);}
}bool myStackEmpty(MyStack* obj) {
return   QueueEmpty(&obj->p)&&QueueEmpty(&obj->q);
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->p);QueueDestroy(&obj->q);free(obj);
}

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

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

相关文章

[web安全原理分析]-XXE漏洞入门

前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞&#xff0c;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实体的加载&#xff0c;导致可加载恶意外部文件&#xff0c;造成文件读取、命令执行、内网端口扫描、攻击内网网站、…

国内IEEEXplore访问加速(adblock)

访问IEEEXplore&#xff0c;需要加载一个网页需要等好久&#xff0c;然后才出来&#xff0c;就很奇怪&#xff0c;查到网上有同样这个问题 感谢原博主&#xff1a;ieeexplore加载慢的解决办法 核心原因&#xff1a; 国内无法访问地址&#xff1a; https://cdn.jwplayer.com/…

Redis数据结构——QuickList、SkipList、RedisObjective

承接上文&#xff0c;本文主要介绍QuickList、SkipList、RedisObjective 四、 Redis数据结构-QuickList 问题1&#xff1a;ZipList虽然节省内存&#xff0c;但申请内存必须是连续空间&#xff0c;如果内存占用较多&#xff0c;申请内存效率很低。怎么办&#xff1f; ​ 答&a…

C++入门篇---(命名空间、缺省参数、以及输入、输出)

前言 c 我来了,恭喜牛牛解锁新世界.开启c的学习之旅. &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解C…

pg事务:子事务

什么是子事务&#xff1f; 一般事务只能整体提交或回滚&#xff0c;而子事务允许部分事务回滚。 SAVEPOINT p1 在事务里面打上保存点标记。不能直接提交子事务&#xff0c;子事务也是通过事务的提交而提交。不过可以通过ROLLBACK TO SAVEPOINT p1回滚到该保存点。 子事务在大…

【场景方案】如何去设计并二次封装一个好用的axios,给你提供一个好的参考(1.0版)

文章目录 前言文件结构建议封装的文件结构接口管理文件 二次封装axios的初始配置initutilswebConfig 再封一层环境配置使用 前言 以下演示基于vue3与element-plus 文件结构建议 封装的文件结构 把二次封装axios所有有关的代码全部放在request文件夹中&#xff0c;其中init.js…

【TypeScript】TS中type和interface在类型声明时的区别

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3+vite+typeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免费领取 …

南京邮电大学算法与设计实验二:贪心算法(最全最新,与题目要求一致)

三、实验原理及内容 实验原理&#xff1a; 1、用贪心法实现求两序列的一般背包问题。要求掌握贪心法思想在实际中的应用&#xff0c;分析一般背包的问题特征&#xff0c;选择算法策略并设计具体算法&#xff0c;编程实现贪心选择策略的比较&#xff0c;并输出最优解和最优解值。…

机器学习项目实战-能源利用率 Part-4(模型构建)

博主前期相关的博客可见下&#xff1a; 机器学习项目实战-能源利用率 Part-1&#xff08;数据清洗&#xff09; 机器学习项目实战-能源利用率 Part-2&#xff08;探索性数据分析&#xff09; 机器学习项目实战-能源利用率 Part-3&#xff08;特征工程与特征筛选&#xff09; 这…

【JVM】6. 堆

文章目录 6.1. 堆&#xff08;Heap&#xff09;的核心概述6.1.1. 堆内存细分6.1.2. 堆空间内部结构&#xff08;JDK7&#xff09;6.1.3. 堆空间内部结构&#xff08;JDK8&#xff09; 6.2. 设置堆内存大小与OOM6.2.1. 堆空间大小的设置6.2.2. OutOfMemory举例 6.3. 年轻代与老年…

如何在IDEA中显示时序图

如何在IDEA中显示时序图 有时候&#xff0c;我们想要了解代码的运行过程的时候&#xff0c;想要看到方法的调用流程。 这个时候就希望有一个时序图可以看&#xff0c;但是人工来画时序图太麻烦了&#xff0c;有没有办法在IDEA中直接生成呢&#xff1f; 当然是可以的。 这里…

知识积累(1)

&#xff08;1&#xff09; 当您在Git中看到消息 "HEAD is now at 1343ccb FAB-17419 Fix off_chain_data sample error (#146)" 时&#xff0c;这是Git告知您当前所在的分支和最新的提交哈希。 这条消息通常出现在使用Git命令后&#xff0c;如git pull或git check…

【我的创作纪念日】—— 纪念四年的坚持

这是一篇和技术无关的博客&#xff0c;但对我而言&#xff0c;它承载了不菲的价值 普通且宁静的一天&#xff0c;被一条消息戳中&#xff0c;于是&#xff0c;写一篇分享帖&#xff0c;纪念我这 1460 天的坚持初衷&#xff1a; 前言&#xff1a;对过去的回顾 4 年前的我&#…

Python图片转字符画,太好玩啦(46)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日主题 什么是字符画呢&#xff1f; 如何用Python将图片转为字符画&#xff1f; 我们先找一幅原画&#xff0c;比如它吧&…

卡方检验.医学统计实例详解

卡方检验是一种常用的假设检验方法&#xff0c;通常用于分析两个或多个分类变量之间的关系。在医学研究中&#xff0c;卡方检验被广泛应用于分析两种或多种治疗方法的疗效&#xff0c;或者分析某种疾病的发病率与某些危险因素之间的关系。下面我们来看一个卡方检验在医学实例中…

WALN网络不存在? 离谱事件解决方法

前情&#xff1a; 本来在高高兴兴赶ddl&#xff0c;突然发现网断了。尝试重连&#xff0c;显示无法连接... 遂重启&#xff0c;结果事情更糟了&#xff0c;WALN就没了&#xff0c;没了&#xff0c;没了... 这张是修好之后的图&#xff0c;但是当时所有包括蓝牙&#xff0c;waln…

13-2-CSS3-渐变色、2D转换、3D转换

一、渐变色 CSS渐变色&#xff08;Gradient&#xff09;是指在元素背景中使用两种或多种不同的颜色进行过渡&#xff0c;超过两个颜色可以形成更为细腻的渐变效果。常见的CSS渐变色有线性渐变和径向渐变。 1. 线性渐变&#xff1a;Linear Gradients 向下/向上/向左/向右/对角…

t检验与Z检验的区别

在统计学中&#xff0c;假设检验是评估某种特定情况下观察到的数据是否符合假设的一种方法。t检验和Z检验是两种常用的假设检验方法&#xff0c;分别用于比较均值差异以及比例差异。在医学统计中&#xff0c;t检验和Z检验经常被用于研究和比较不同治疗方法的效果&#xff0c;例…

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…

IntelliJ 导出和导入配置文件

导出&#xff1a; File->Manage IDE Setting->Export Settings…->选择导出目录&#xff0c;可以得到一个 settings.zip 的文件 导入方法&#xff1a; File->Manage IDE Setting->Import Settings…->选择需要导入的文件即可&#xff0c;导入之后重启IDE。