408 数据结构队列算法

news/2024/11/15 15:58:18/文章来源:https://www.cnblogs.com/lingchuanfeng/p/18328818

第三章 队列

3.1顺序队列

#define MAXSIZE 64
typedef int ElemType;
typedef struct {ElemType data[MAXSIZE];int front;	//队头指针int rear;	//队尾指针int size;	//队列大小
}SeQueue;//初始化队列
void initQueue(SeQueue& Q) {//对数据元素进行初始化,防止出现脏数据for (int i = 0; i < MAXSIZE; i++) {Q.data[i] = 0;}Q.front = 0;	//初始化队头指针指向0索引Q.rear = 0;		//队尾指针也指向0索引Q.size = 0;		//队列大小为0
}//判断队列是否为空
bool isEmpty(SeQueue Q) {//return Q.front == Q.rear;	//如果front和rear指向同一个位置则队列为空return Q.size == 0;			//或直接用size是不是0来判断
}//元素x入队
void enQueue(SeQueue& Q, ElemType x) {Q.data[Q.rear++] = x;	//在尾指针位置插入元素x后将尾指针后移(尾指针始终指向待入队元素的位置)Q.size++;	//位置队列长度
}//队头元素出队,并返回
ElemType deQueue(SeQueue& Q) {if (!isEmpty(Q)) {		//如果队列不为空Q.size--;			//队列长度-1return Q.data[Q.front++];	//返回队头元素后将队头指针后移}return -999;		//如果队列为空返回-999代表空
}//获取队首元素
ElemType getHead(SeQueue Q) {if (isEmpty(Q)) {		//如果队列不为空,直接返回队头元素否则返回-999return Q.data[Q.front];}return -999;
}//获取队列长度
int getSize(SeQueue Q) {//return Q.size;		//直接返回Q.size即队列长度return Q.rear - Q.front;	//队尾指针位置-队头指针位置也为队列长度
}//打印队列
void printQueue(SeQueue Q) {if (isEmpty(Q)) {return;}for (int i = Q.front; i < Q.rear; i++) {	//队头开始遍历printf("%d ", Q.data[i]);}printf("\n");printf("Q.front = %d ,Q.rear = %d,Q.size = %d\n", Q.front, Q.rear, Q.size);
}

3.2循环队列

#define MAXSIZE 8
typedef int ElemType;
typedef struct {ElemType data[MAXSIZE];int front;	//队头指针int rear;	//队尾指针int size;	//队列大小
}Queue;
/*
*用size判断队列空队列满可以避免一个空间的浪费,如果不使用size的话,至少要浪费一个空间来区分队满和队空
*/
//初始化队列
void initQueue(Queue& Q) {//对数据元素进行初始化,防止出现脏数据for (int i = 0; i < MAXSIZE; i++) {Q.data[i] = 0;}Q.front = 0;	//初始化队头指针指向0索引Q.rear = 0;		//队尾指针也指向0索引Q.size = 0;		//队列大小为0
}//判断队列是否已满bool isFull(Queue Q) {return (Q.rear + 1) % MAXSIZE == Q.front;//return Q.size == MAXSIZE;
}//判断队列是否为空
bool isEmpty(Queue Q) {return Q.front == Q.rear;//return Q.size == 0;
}//元素x入队
void enQueue(Queue& Q, ElemType x) {if (isFull(Q)) {return;}Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MAXSIZE;	Q.size++;
}//队头元素出队,并返回
ElemType deQueue(Queue& Q) {if (isEmpty(Q)) {return -999;}ElemType x = Q.data[Q.front];Q.front = (Q.front + 1) % MAXSIZE;Q.size--;return x;
}//获取队首元素
ElemType getHead(Queue Q) {return Q.data[Q.front];
}//获取队列长度
int getSize(Queue Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;//return Q.size;
}//打印队列元素
void printQueue(Queue Q) {if (isEmpty(Q)) {return;}int len = getSize(Q);int i = Q.front;while (len > 0) {printf("%d ", Q.data[i]);i++;if (i >= MAXSIZE) {i = 0;}len--;}printf("\n");
}

3.3链队列

typedef int ElemType;
//结点结构
typedef struct LNode {ElemType data;LNode* next;
}LNode;//队列结构
typedef struct {LNode* front;	//队列的队头指针LNode* rear;	//队列的队尾指针int size;		//队列大小
}LinkedQueue;//初始化队列
void initQueue(LinkedQueue& Q) {Q.front = NULL;Q.rear = NULL;Q.size = 0;
}//判断队列是否为空
bool isEmpty(LinkedQueue Q) {if (Q.front == NULL && Q.rear == NULL) {return true;}else {return false;}
}//元素x入队
void enQueue(LinkedQueue& Q, ElemType x) {LNode* node = (LNode *)malloc(sizeof(LNode));node->data = x;node->next = NULL;//如果是入队的第一个元素if (Q.front == NULL && Q.rear == NULL) {Q.front = node;Q.rear = node;}else {Q.rear->next = node;	//最后一个结点的next指向新结点元素Q.rear = node;			//rear指向新结点}Q.size++;				//队列长度+1
}//队头元素出队,并返回
ElemType deQueue(LinkedQueue& Q) {if (isEmpty(Q)) {return -999;}LNode* removed = Q.front;	//记录队头(即被删除元素结点以便释放空间)ElemType x = removed->data;	//接收队头元素以便返回Q.front = Q.front->next;	//队头后移//如果已经出队直到没元素了,别忘了也让Q.rear = nullif (Q.front == NULL) {Q.rear = Q.front;}free(removed);	//释放删除结点空间Q.size--;		//队列长度-1return x;
}//获取队首元素
ElemType getHead(LinkedQueue Q) {if (isEmpty(Q)) {return -999;}return Q.front->data;
}//获取队列长度
int getSize(LinkedQueue Q) {return Q.size;
}//打印队列元素
void printQueue(LinkedQueue Q) {LNode* p = Q.front;while (p) {printf("%d ", p->data);p = p->next;}printf("\n");
}

3.4双端队列(带头双链表实现)

//用双链表(带头结点)实现双端队列
typedef int ElemType;typedef struct DNode {ElemType data;		//数据域DNode* prior;		//指向前驱结点的指针域DNode* next;		//指向后继结点的指针域
}DNode;typedef struct {DNode* front;	//队头指针DNode* rear;	//队尾指针int size;		//队列长度
}DeQueue;//初始化双端队列
void initDeQueue(DeQueue& Q) {DNode* head = (DNode*)malloc(sizeof(DNode));	//申请头结点//初始化头结点head->next = NULL;		head->prior = NULL;Q.front = head;	//队列的头指针和尾指针都指向头结点Q.rear = head;Q.size = 0;		//队列大小初始化为0
}//判断队列是否为空
bool isEmpty(DeQueue Q) {return Q.size == 0;	
}//向队头添加元素e
void pushHead(DeQueue& Q, ElemType e) {DNode* node = (DNode*)malloc(sizeof(DNode));	//申请结点空间node->data = e;	//为新元素结点赋值node->next = NULL;	//新结点结点前序后继初始化指向空node->prior = NULL;if (Q.front == Q.rear) {	//如果此时队列还无元素,插入第一个元素时node->prior = Q.front;		//新结点的前序是头结点Q.front->next = node;		//头结点的后继是当前新结点Q.rear = node;				//队尾来到新结点的位置}//如果入队的元素不是第一个else {				node->next = Q.front->next;	//当前结点的后继是头结点的后继Q.front->next->prior = node;	//头结点的后继的前序是当前节点Q.front->next = node;		//头结点的后继是当前结点node->prior = Q.front;		//当前结点的前序是头结点}Q.size++;			//队列长度+1
}//从队头移除元素并返回
ElemType popHead(DeQueue& Q) {if (isEmpty(Q)) {		//如果队列为空返回-999代表空return -999;	}DNode* removed = Q.front->next;		//记录被删除结点ElemType x = removed->data;			//记录被删除结点的元素值if (removed->next == NULL) {		//如果队列只有一个元素了Q.front->next = NULL;			//直接让头结点的next指向NULLQ.rear = Q.front;				//队列的尾指针指向头结点表示队列已经为空了}else {Q.front->next = removed->next;	//头结点的后继指向被删除结点的后继removed->next->prior = Q.front;	//被删除结点的后继的前序指向头结点}free(removed);	//释放空间队列长度-1Q.size--;return x;
}//向队尾添加元素e
void pushTail(DeQueue& Q, ElemType e) {DNode* node = (DNode*)malloc(sizeof(DNode));	//申请新结点空间node->data = e;		//给新结点赋值node->next = NULL;	//新结点的next先指向空Q.rear->next = node;	//队尾指针的next指向新结点node->prior = Q.rear;	//新结点的prior指向尾指针结点Q.rear = node;			//尾指针来到新结点位置Q.size++;	//队列长+1
}//从队尾删除元素并返回
ElemType popTail(DeQueue& Q) {if (isEmpty(Q)) {return -999;}DNode* removed = Q.rear;	//记录被删除结点ElemType x = removed->data;	//记录被删除结点的元素值Q.rear->prior->next = NULL;	//队尾指针结点的前序的后继指向空,即倒数第二个结点的next指向空Q.rear = Q.rear->prior;	//队尾指针来到倒数第二个结点处free(removed);		//释放最后一个结点空间Q.size--;return x;
}//获取队头元素
ElemType peekHead(DeQueue Q) {if (isEmpty(Q)) {return -999;}return Q.front->next->data;	//第一个元素是头结点的next
}//获取队尾元素
ElemType peekTail(DeQueue Q) {if (isEmpty(Q)) {return -999;}return Q.rear->data;
}//从前往后打印队列元素
void printDeQueuefromHead(DeQueue Q) {if (isEmpty(Q)) {return;}DNode* p = Q.front->next;while (p) {printf("%d ", p->data);p = p->next;}printf("\n");
}//从后往前打印队列元素
void printDeQueuefromTail(DeQueue Q) {if (isEmpty(Q)) {return;}DNode* p = Q.rear;while (p!=Q.front) {printf("%d ", p->data);p = p->prior;}printf("\n");
}//获取队列长度
int getSize(DeQueue Q) {return Q.size;
}

3.5栈和队列的相关题目

01.设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。
试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。

bool isSymmetry(LinkedList L) {int len = length(L) / 2;	//计算表长的一半,将一半元素入栈LNode* p = L;SqStack S;initStack(S);while (len > 0) {	//将一半元素入栈push(S, p->data);p = p->next;len--;}if (length(L) % 2 == 1) {	//如果表长为奇数,跳过最中间的一个p = p->next;}while (p) {if (pop(S) != p->data) {	//从右半边的第一个开始和栈中元素依次比较return false;		//如果有一个不满足栈顶元素和当前元素值相等返回false}p = p->next;}return true;
}

02.假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操
作序列可表示为仅由I和O组成的序列,可以操作的序列称为合法序列,否则称为
非法序列。
1)下面所示的序列中哪些是合法的?
A. IOIIOIOO
B. IOOIOIIO.
C. IIIOIOIO
D. IIIOOIO0
2)通过对1) 的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回
true,否则返回false (假定被判定的操作序列已存入一维数组中)。
*/

bool isLegal(SqList L) {SqStack S;initStack(S);for (int i = 0; i < L.length; i++) {if (L.data[i] == 0) {	//用0表示O,1表示I。如果要出栈先看是不是空栈if (isEmpty(S)) {	//是空栈返回falsereturn false;	}else {		//不是空栈直接把栈顶元素出站pop(S);}}else {		//入栈元素(随便入个元素模拟即可)push(S, -1);}}return isEmpty(S);	//最后如果栈为空证明合法。否则不合法
}

03.若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0
或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。
试编写与此结构相应的入队和出队算法。

typedef int ElemType;
typedef struct {ElemType data[MAXSIZE];int front;	//队头指针int rear;	//队尾指针int tag;	//用来标记队空还是队满 0 表示队空,1表示堆满
}Queue;//初始化队列
void initQueue2(Queue& Q) {//对数据元素进行初始化,防止出现脏数据for (int i = 0; i < MAXSIZE; i++) {Q.data[i] = 0;}Q.front = 0;	//初始化队头指针指向0索引Q.rear = 0;		//队尾指针也指向0索引Q.tag = 0;      //初始化时tag=0表示队列为空
}//判断队列是否已满bool isFull2(Queue Q) {return Q.tag == 1 && Q.front == Q.rear;
}//判断队列是否为空
bool isEmpty2(Queue Q) {return Q.tag == 0 && Q.front == Q.rear;
}//元素x入队
void enQueue2(Queue& Q, ElemType x) {if (isFull2(Q)) {printf("队列已满\n");return;}Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MAXSIZE;//入队元素之后可能导致队列变满,如果满注意修改tagif (Q.rear == Q.front) {Q.tag = 1;}
}//队头元素出队,并返回
ElemType deQueue2(Queue& Q) {if (isEmpty2(Q)) {printf("队列已空\n");return -999;}ElemType x = Q.data[Q.front];Q.front = (Q.front + 1) % MAXSIZE;//出队后可能导致队列变空if (Q.front == Q.rear) {Q.tag = 0;}return x;
}

04.Q是一个队列,S是一个空栈,实现将队列中的元素逆置的算法。

//借助栈
void inverQueue(Queue& Q) {SqStack S;initStack(S);while (!isEmpty(Q)) {	//如果队列不为空ElemType x = deQueue(Q);	//依次出队并将出队元素进栈push(S, x);}while (!isEmpty(S)) {		//如果栈不为空enQueue(Q, pop(S));		//出栈并将出栈元素进队}
}//利用递归
void inverQueue2(Queue& Q) {if (isEmpty(Q)) {		//终止条件return;}ElemType x = deQueue(Q);	//元素出队inverQueue2(Q);				//递归后续队列元素enQueue(Q, x);				//从前往后入队
}

05.用两个栈模拟队列的入队出队操作

void enToNewQueue(SqStack& S1,ElemType x) {	//模拟入队if (isFull(S1)) {	//S1作为辅助栈,如果S1不满,元素入队都入到S1中return;}push(S1, x);
}ElemType deFromNewQueue(SqStack& S1, SqStack& S2) {	//模拟出队if (!isEmpty(S2)) {		//元素始终在S2中出队,如果S2有元素直接出队return pop(S2);}if (isEmpty(S1)) {return -999;	//如果S2和S1中都无元素,返回-999代表空}else {				//如果S2中无元素,看S2中是否有元素,如果有全部从S1出栈放到S2栈中while (!isEmpty(S1)) {push(S2, pop(S1));}}return pop(S2);		//返回S2的栈顶元素
}bool isEmpty(SqStack S1, SqStack S2) {return isEmpty(S1) && isEmpty(S2);	//如果S1和S2都为空则返回空
}
void print(SqStack S1, SqStack S2) {while (!isEmpty(S2)) {printf("%d ", pop(S2));}while (!isEmpty(S1)) {push(S2, pop(S1));}while (!isEmpty(S2)) {printf("%d ", pop(S2));}printf("\n");
}

06.假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别表达式中的括号是否配对,以字符“\0” 作为算术表达式的结束符。

bool bracketCheak(char* str) {SqStack2 S;initStack2(S);int i = 0;while (str[i] != '\0') {switch (str[i]) {//左括号时直接压栈case '(':case'[':case'{':push2(S, str[i]);break;//右括号时如果栈为空或者栈顶与当前元素不匹配返回falsecase')':if (isEmpty2(S) || pop2(S) != '(')return false;break;case']':if (isEmpty2(S) || pop2(S) != '[')return false;break;case'}':if (isEmpty2(S) || pop2(S) != '{')return false;break;default:return false;break;}i++;}return isEmpty2(S);		//最后如果栈为空匹配成功,如果栈中还有元素不匹配
}

07.按下图所示铁道进行车厢调度(注意,两侧铁道均为单向行驶道,火车调度站有一个用于调度的“栈道”),火车调度站的入口处有n节硬座和软座车厢(分别用H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软座车厢都被调整到硬座车厢之前。

image-20240118212106464

void train(char* train) {char* p = train, * res = train;//p是遍历指针,res理解成队尾指针(即该在哪个位置放入元素)SqStack2 S;initStack2(S);while (*p!='\0') {if (*p == 'H') {		//如果是硬座进栈push2(S, 'H');		}else {*(res++) = *p;	//如果是软座直接放到前面,res后移每次指向该连接的车厢}p++;}while (!isEmpty2(S)) {	//把栈中存的硬座车厢都甩后面去*(res++) = pop2(S);}//最后train就是排好的车厢
}

08.后缀表达式求值

int evalRPN(char* str) {Stack S;initStack(S);int i = 0;while (str[i] != '\0') {int cur = str[i] - '0';	//为了将char类型的数字'1'转成整型1switch (str[i]){case '+': {				//操作符弹栈两个元素计算新的结果重新入栈ElemType a = pop(S);ElemType b = pop(S);push(S, b + a);}break;case '-': {ElemType a = pop(S);ElemType b = pop(S);push(S, b - a);}break;case '*': {ElemType a = pop(S);ElemType b = pop(S);push(S, b * a);}break;case '/': {ElemType a = pop(S);ElemType b = pop(S);push(S, b / a);}break;default:push(S,cur);	//操作数直接入栈break;}i++;}return peek(S);		//最后栈顶元素就是结果
}

09.中缀表达式转后缀表达式

int priority(char ch) {if (ch == '*' || ch == '/') {return 2;}else if (ch == '+' || ch == '-') {return 1;}else if (ch == '(') {return 0;}
}
char* solve(char* str) {char* res = (char*)malloc(sizeof(char) * 100);int i = 0;int j = 0;SqStack S;initStack(S);while (str[i] != '\0') {//遇到操作符时if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/') {//如果栈为空,直接将操作符入栈if (isEmpty(S)) {push(S, str[i]);}else {//当前操作符的优先级高于栈顶优先级时,直接入栈if (priority(str[i]) > priority(peek(S))) {push(S, str[i]);}else {//当栈不为空时去看栈中运算符优先级是否比当前操作符的优先级高或相等,满足大于等于时出栈while (!isEmpty(S) && priority(peek(S)) >= priority(str[i])) {res[j++] = pop(S);}//最后将当前操作符入栈push(S, str[i]);}}}//遇到左小括号直接入栈else if (str[i] == '(') {push(S, str[i]);}//遇到右小括号将栈中(之前的操作符都出栈else if (str[i] == ')') {while (!isEmpty(S) && peek(S) != '(') {res[j++] = pop(S);}//最后也将(出栈pop(S);}//如果是操作数直接连接到新的字符串后面else {res[j++] = str[i];}i++;//遍历指针每次后移}while (!isEmpty(S)) {res[j++] = pop(S);}res[j] = '\0';return res;
}

10.对于任意的无符号的十进制整数m,写出将其转换为十六进制整数的算法(转换仅要求能够输出正确的十六进制的整数即可)。[兰州大学(10 分)]

void decimalToHexadecimal(unsigned int m) {SqStack stack;initStack(stack);// 不断除以16,将余数入栈while (m != 0) {push(stack, m % 16);m /= 16;}//转8进制/*while (m != 0) {push(stack, m % 8);m /= 8;}*///转二进制/*while (m != 0) {push(stack, m % 2);m /= 2;}*/// 出栈并打印while (!isEmpty(stack)) {unsigned int hex = pop(stack);if (hex < 10) {printf("%d", hex);}else {printf("%c", 'A' + hex - 10); // 10~15 对应 A~F}}printf("\n");
}

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

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

相关文章

408数据结构树算法

第四章 树 4.1 二叉树的顺序存储 #define MAXSIZE 16 typedef int ElemType; typedef struct {ElemType data[MAXSIZE];int size; }Tree;//初始化二叉树 void initTree(Tree& T) {for (int i = 0; i < MAXSIZE; i++) {T.data[i] = 0; //假设0表示空节点}T.size = 0; } /…

多项式全家桶

多项式合集 前置知识:多项式的定义,表示方法,FFT,NTT,微积分等。 注意事项多项式的封装很重要,现在一般都是用将指针传入一个函数的方式来进行多项式操作,如:void Inv(ll *f,ll *g,int n),表示对 \(n\) 次多项式 \(f\) 求逆,结果存在 \(g\) 中。 多项式数组多了一定要…

KD-Tree 学习笔记

好想睡觉KD-Tree 学习笔记 建树如果当前超长方体只有一个点,返回这个点 选择一个维度(轮流) 选择中位数(\(O(n)\)) 递归应用定理二维 KDT 中节点代表矩阵与任意一个矩形(边界上)有交的只有 \(O(\sqrt n)\) 个。证明: 考虑一条直线,与KDT的交集,此层最多有两个,递归得…

jmeter 参数理解

线程数 线程数用于模拟并发用户数,每个线程代表一个虚拟用户;线程组内可以有1-多个接口请求,同属于一个线程,理解为单个用户的事务操作;如果只有一个接口那就说单接口的性能 Ramp-Up时间(秒) 定义了所有线程启动所需的时间,合理设置ramp-up时间可以避免瞬时加压,使性能测…

Linux系统中的Vim编辑器

本章将和大家分享Linux系统中的Vim编辑器。本章将和大家分享Linux系统中的Vim编辑器。废话不多说,下面我们直接进入主题。 一、Vim 入门帮助 Vim 带有完整的帮助文档:进入 Vim 后输入“:help”即可访问 二、Vim 模式介绍 与大部分其它编辑器不同,进入 Vim 后,缺省状态下键入…

2024暑假集训测试14

前言比赛链接。最可惜的一点还是本来 T3 暴力能拿 \(20\),优化成 \(15\) 了,不然就 rk2 了,晚上可能又有泡面吃了。 不过因为 T2、T4 两道水题,剩下两道不太可做(至少对于我是这样的),这两题不挂分的打的貌似都不错。 T3 没学过莫反输麻了。 T1 黑暗型高松灯 本来应该是…

一篇文章教你如何读懂 JMeter聚合报告参数!

在进行性能测试时,JMeter是一款备受推崇的开源工具。而其中的聚合报告(Aggregate Report)是我们分析测试结果、了解系统性能的重要依据。今天,我们就来深入探讨如何读懂JMeter聚合报告中的各项参数。 面对复杂的聚合报告,究竟哪些参数是我们必须关注的?这些参数背后又隐藏…

[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂

标题即摘要,暂不赘述。 如果文中有不妥或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18328759 出自【进步*于辰的博客】参考笔记一,P10.4、P13.2;笔记三,P48.1。目录先言1、通用函数2、…

Python 代码中的 yield 到底是什么?

在Python编程中,有一个强大而神秘的关键字,那就是yield。初学者常常被它搞得晕头转向,而高级开发者则借助它实现高效的代码。到底yield是什么?它又是如何在Python代码中发挥作用的呢?让我们一起来揭开它的面纱。 Python里的一个非常重要但也颇具迷惑性的关键词——yield。…

智能家居如何把老款定频空调变成智能“变频”空调#米家#智能家居#HA

背景最近长沙的天气暴热,室内达到了34-35度,天气预报最高温度上了40度,这么酷热的天气,离开了空调,基本上就是一身汗,全身湿透,特别难受,然后不得不开启家里的一台将近10年的老式定频空调,输入功率970W,OMG,一小时将近一度电,假设一天吹10小时,就是10度电,一个月…

联想电脑 win11系统,关闭联想锁屏后,windows聚焦不生效(其他电脑同理)

先排查下前置条件,然后再使用解决方案。附加:如何关闭联想锁屏: 打开联想电脑管家->工具箱->联想锁屏->关闭排查 原因1:是不是使用clash代理导致的联网问题。 解决:在clash启动"UWP应用联网限制解除工具"助手,全选,保存,等待一阵即可以正常更新屏保…

imbalanced-learn库的作用和安装

imbalanced-learn是一个Python库,‌专门用于处理不平衡数据集的机器学习问题。‌ 这个库提供了一系列的重采样技术、‌组合方法和机器学习算法,‌旨在提高在不平衡数据集上的分类性能。‌Imbalanced-learn支持欠采样、‌过采样、‌结合欠采样和过采样的方法,‌以及一些集成学…