数据结构(C语言)代码实现(九)——迷宫探路表达式求值

目录

参考资料

迷宫探路

顺序栈头文件SqStack.h

顺序栈函数实现SqStack.cpp

迷宫探路主函数

表达式求值

链式顺序栈头文件LinkStack.h 

链式顺序栈函数实现LinkStack.cpp

表达式求值主函数

测试结果


参考资料

数据结构严蔚敏版

2021-9-22【数据结构/严蔚敏】【顺序栈&链式栈&迷宫求解&表达式求值】【代码实现算法3.1-3.5】_数据结构表达式求值代码严老师-CSDN博客

栈和队列-数据结构与算法(C语言版)_调用pop(&s,&e)函数,让队头数据出队,赋值给参数e,printf输出e-CSDN博客

迷宫探路

顺序栈头文件SqStack.h

#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码

/*宏函数*/
//函数暂停一段时间
#define Wait(x)\
 {\
	double _Loop_Num_;\
	for(_Loop_Num_=0.01; _Loop_Num_<=100000.0*x; _Loop_Num_+=0.01)\
		;\
 }//设立一个空循环 

typedef struct {
	int x;
	int y;
}PosType;//坐标位置
typedef struct {
	int ord;      //通道块在路径上的“序号”
	PosType seat; //通道块在迷宫中的“坐标位置”
	int di;       //从此通道块走向下一通道块的“方向”
}SElemType;

//-----栈的顺序存储表示-----
#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10    //存储空间分配增量
typedef struct SqStack {
	SElemType* base;//在栈构造之前和销毁之后,base的值为NULL
	SElemType* top; //栈顶指针
	int stacksize;  //当前已分配的存储空间,以元素为单位
}SqStack;
//-----基本操作的函数原型说明-----
Status InitStack(SqStack& S);
//构造一个空栈S
Status DestroyStack(SqStack& S);
//销毁栈S,S不再存在
Status ClearStack(SqStack& S);
//把S置为空栈
Status StackEmpty(SqStack S);
//若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(SqStack S);
//返回S的元素个数,即栈的长度
Status GetTop(SqStack S, SElemType& e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(SqStack& S, SElemType e);
//插入元素e为新的栈顶元素
Status Pop(SqStack& S, SElemType& e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(SqStack S, void(*visit)(SElemType));
//从栈顶到栈底依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败

顺序栈函数实现SqStack.cpp

#include "SqStack.h"

//-----基本操作的函数算法描述(部分)-----
Status InitStack(SqStack& S) {
	//构造一个空栈S
	S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
	if (!S.base)exit(OVERFLOW);//存储分配失败,警告C6011
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}

Status DestroyStack(SqStack& S) {
	free(S.base);
	S.top = S.base = NULL;
	S.stacksize = 0;
	return OK;
}

Status ClearStack(SqStack& S) {
	if (!S.base)return ERROR;
	S.top = S.base;
	return OK;
}

Status StackEmpty(SqStack S) {
	if (S.base == S.top)
		return OK;
	return ERROR;
}

int StackLength(SqStack s) {
	if (!s.base)
		return ERROR;
	return (int)(s.top - s.base);
}

Status GetTop(SqStack s, SElemType& e) {
	//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
	if (s.base == s.top)
		return ERROR;
	e = *(s.top - 1);
	return OK;
}

Status Push(SqStack& s, SElemType e) {
	//插入元素e为新的栈顶元素
	if (!s.base)return ERROR;
	if (s.top - s.base >= s.stacksize) {//栈满,追加存储空间
		s.base = (SElemType*)realloc(s.base, (s.stacksize + STACKINCREMENT) * sizeof(SElemType));
		if (!s.base)exit(_OVERFLOW);//存储分配失败
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCREMENT;
	}
	*s.top++ = e;//*s.top=e; s.top++;
	return OK;
}

Status Pop(SqStack& s, SElemType& e) {
	//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
	if (!s.base || s.top == s.base) return ERROR;
	e = *--s.top;//--s.top; e=*s.top;
	return OK;
}

Status StackTraverse(SqStack s, void (*visit)(SElemType)) {
	SElemType* p = s.base;
	if (!s.base)return ERROR;
	while (p < s.top)
		visit(*p++);
	printf("\n");
	return OK;
}

迷宫探路主函数

#include "SqStack.h"

#define MAXSIZE 15
#define X 4
#define SleepTime 3
/* 迷宫类型定义 */
typedef enum {
	Wall,       // 外墙
	Obstacle,   // 迷宫内部障碍
	Way,        // 通路
	Impasse,    // 死胡同
	East, South, West, North //当前探索方向:东南西北
} CellType;

typedef int MazeType[MAXSIZE][MAXSIZE];

//用到的函数
SElemType Construct(int ord, PosType seat, int di);
//创建通道块信息并返回,序号、坐标位置和下一个访问方向
PosType NextPos(PosType seat, int di);
//获得下一个应当探索的位置
Status MazePath(MazeType maze, PosType start, PosType end);
//迷宫寻路主函数,第一个变量类型为int*,是地图的首地址。
void InitMaze(MazeType maze, PosType& start, PosType& end);
//初始化迷宫,start和end分别为迷宫的入口坐标和出口坐标
Status Pass(MazeType maze, PosType seat);
//判断当前位置是否为首次探索
void FootPrint(MazeType maze, PosType seat);
//留下初始访问足迹,初始访问足迹即向东访问
void MarkPrint(MazeType maze, PosType seat, int mark);
//留下标记+绘制迷宫
Status Equals(PosType a, PosType b);
//比较两个结构体
void PaintMaze(MazeType maze);
//绘制迷宫,以图形的方式呈现迷宫当前的状态

Status MazePath(MazeType maze, PosType start, PosType end) {
    //若迷宫maze中存在从入口start到出口end的通道,则求得一条存放在栈中
    //(从栈底到栈顶),并返回TRUE;否则返回FALSE
    SqStack S;       //存储探索过的通道块
    PosType curpos;  //当前位置
    SElemType e;     //当前通道块信息
    int curstep;     //当前通道块序号
    InitStack(S);curpos = start;//设定“当前位置”为“入口位置”
    curstep = 1;            //探索第一步
    do {
        if (Pass(maze, curpos)) {//当前位置可以通过,即是未曾走到过的通道块
            FootPrint(maze, curpos);//留下足迹
            e = Construct(curstep, curpos, East);
            Push(S, e);             //加入路径
            if (Equals(curpos, end) == TRUE) {
                printf("\n寻路成功\n\n");
                return TRUE;        //到达终点(出口)
            }
            curpos = NextPos(curpos, East);//下一位置是当前位置的东邻
            curstep++;              //探索下一步
        }
        else {//当前位置不能通过
            if (!StackEmpty(S)) {
                Pop(S, e);
                while (e.di == North && !StackEmpty(S)) {
                    MarkPrint(maze, e.seat, Impasse);
                    Pop(S, e);
                }
                if (e.di < North) {
                    e.di++;
                    MarkPrint(maze, e.seat, e.di);
                    Push(S, e);
                    curpos = NextPos(e.seat, e.di);
                    //不需要curstep++,因为还是上次入栈的位置块
                }
            }
        }
    } while (!StackEmpty(S));
    printf("\n寻路失败!!\n\n");
    return FALSE;
}

//初始化一个规模为N*N迷宫
//start和end分别为迷宫的入口坐标和出口坐标
//注:教材中无此操作,但该操作是必须存在的
void InitMaze(MazeType maze, PosType& start, PosType& end) {
    int i, j, tmp;
    srand((unsigned)time(NULL));//用系统时间做随机数种子
    for (i = 0;i < MAXSIZE;i++) {
        for (j = 0;j < MAXSIZE;j++) {
            //边缘部分设置围墙
            if (i == 0 || j == 0 || i == MAXSIZE - 1 || j == MAXSIZE - 1) {
                maze[i][j] = Wall;
            }
            else {
                //生成随机数[0,X-1]填充迷宫
                tmp = rand() % X;
                //1/X之一的概率生成障碍,否则生成通路块
                if (tmp == 0)
                    maze[i][j] = Obstacle;
                else
                    maze[i][j] = Way;
            }
        }
    }//迷宫内部设障完毕
    start.x = 1;
    start.y = 0;
    end.x = MAXSIZE - 2;
    end.y = MAXSIZE - 1;
    maze[1][0] = maze[MAXSIZE - 2][MAXSIZE - 1] = Way;
    //显示迷宫的初始状态
    PaintMaze(maze);
}

Status Pass(MazeType maze, PosType seat) {
    int x = seat.x;
    int y = seat.y;
    if (x<0 || y<0 || x>MAXSIZE - 1 || y>MAXSIZE - 1)
        return FALSE;
    if (maze[x][y] != Way)
        return FALSE;
    return TRUE;
}

PosType NextPos(PosType seat, int di) {
    PosType tmp = seat;
    switch (di) {
    case East:
        tmp.y++;//向东
        break;
    case South:
        tmp.x++;//向东
        break;
    case West:
        tmp.y--;//向东
        break;
    case North:
        tmp.x--;//向东
        break;
    }
    return tmp;
}

void FootPrint(MazeType maze, PosType seat) {
    MarkPrint(maze, seat, East);
}

void MarkPrint(MazeType maze, PosType seat, int mark) {
    maze[seat.x][seat.y] = mark;
    PaintMaze(maze);
}

SElemType Construct(int ord, PosType seat, int di) {
    SElemType e;
    e.di = di;
    e.seat = seat;
    e.ord = ord;
    return e;
}

Status Equals(PosType a, PosType b) {
    if (a.x == b.x && a.y == b.y)
        return TRUE;
    else
        return FALSE;
}
/*
 * 绘制迷宫
 * 以图形的方式呈现迷宫当前的状态
 *
 *【注】
 * 教材中无此操作
 * 此处增加该操作的目的是观察寻路过程的每一步
 */
void PaintMaze(MazeType maze) {
    int i, j;
    Wait(SleepTime);
    system("cls");                           //清空,下面是重新打印
    for (i = 0; i < MAXSIZE; i++) {
        for (j = 0; j < MAXSIZE; j++) {
            if (maze[i][j] == Wall) {                   // 外墙
                printf("▇");
            }
            else if (maze[i][j] == Obstacle) {        // 迷宫内部的障碍
                printf("X");
            }
            else if (maze[i][j] == East) {            // 正在朝东探索
                printf("→");
            }
            else if (maze[i][j] == South) {           // 正在朝南探索
                printf("↓");
            }
            else if (maze[i][j] == West) {            // 正在朝西探索
                printf("←");
            }
            else if (maze[i][j] == North) {           // 正在朝北探索
                printf("↑");
            }
            else if (maze[i][j] == Impasse) {         // 死胡同,即四个方向都探索过,但无法通过的位置
                printf("★");
            }
            else {                                   // 还未探索过的路径结点
                printf(" ");
            }

            if (j != 0 && j % (MAXSIZE - 1) == 0) {           // 每隔N个结点换行
                printf("\n");
            }
        }
    }
    printf("\n");
}

    int main(int argc, char* argv[]){
    MazeType maze;
    PosType start, end;
    char ch,Re = 'Y';

    while (Re == 'Y' || Re == 'y') {
        InitMaze(maze, start, end);    // 初始化迷宫,包括出入口

        MazePath(maze, start, end);      // 迷宫寻路

        printf("重置?(Y/N):");
        scanf_s("%c", &Re, 1);
        ch = getchar();

        printf("\n");
    }

    return 0;
}

表达式求值

链式顺序栈头文件LinkStack.h 

#pragma once
#pragma once
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;//Status是函数的类型,其值是函数结果状态代码
typedef char SElemType;

//-----栈的顺序存储表示-----
#define STACK_INIT_SIZE 100  //存储空间初始分配量
#define STACKINCREMENT 10    //存储空间分配增量
typedef struct SNode {
	SElemType data;//数据域
	struct SNode* next;//
}SNode,*LinkStack;
//-----基本操作的函数原型说明-----
Status InitStack(LinkStack& S);
//构造一个空栈S
Status DestroyStack(LinkStack& S);
//销毁栈S,S不再存在
Status ClearStack(LinkStack& S);
//把S置为空栈
Status StackEmpty(LinkStack S);
//若栈S为空栈,则返回TRUE,否则返回FALSE
int StackLength(LinkStack S);
//返回S的元素个数,即栈的长度
Status GetTop(LinkStack S, SElemType& e);
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
Status Push(LinkStack& S, SElemType e);
//插入元素e为新的栈顶元素
Status Pop(LinkStack& S, SElemType& e);
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status StackTraverse(LinkStack S, void(*visit)(SElemType));
//从栈底到栈顶依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败
Status StackTraverse_Top(LinkStack S, Status(*pfn_visit)(SElemType));
//从栈顶到栈底依次对栈中每个元素调用函数visit()。一旦visit()失败,则操作失败

链式顺序栈函数实现LinkStack.cpp

#include "LinkStack.h"

Status InitStack(LinkStack& S) {
	S = (LinkStack)malloc(sizeof(SNode));
	if (!S)
		exit(OVERFLOW);
	S->next = NULL;
	return OK;
}

Status DestroyStack(LinkStack& S) {
	LinkStack p = S->next, pp;
	while (p) {
		pp = p->next;
		free(p);
		p = pp;
	}
	free(S);
	return OK;
}

Status ClearStack(LinkStack& S) {
	LinkStack p = S->next, pp;
	while (p) {
		pp = p->next;
		free(p);
		p = pp;
	}
	S->next = NULL;
	return OK;
}

Status StackEmpty(LinkStack S) {
	if (S->next == NULL)
		return OK;
	else
		return FALSE;
}

int StackLength(LinkStack S) {
	int n = 0;
	LinkStack p = S->next;
	while (p) {
		n++;
		p = p->next;
	}
	return n;
}

Status GetTop(LinkStack S, SElemType& e) {
	if (S->next == NULL)
		return ERROR;
	e = S->next->data;
	return OK;
}

Status Push(LinkStack& S, SElemType e) {
	LinkStack p = (LinkStack)malloc(sizeof(SNode));
	p->data = e;
	p->next = S->next;
	S->next = p;
	return OK;
}

Status Pop(LinkStack& S, SElemType& e) {
	if (S->next == NULL)
		return ERROR;
	e = S->next->data;
	LinkStack pp = S->next->next;
	free(S->next);
	S->next = pp;
	return OK;
}

Status StackTraverse(LinkStack S, void(*visit)(SElemType)) {
	if (S->next == NULL) {
		printf("栈为空!\n");
		return ERROR;
	}
	for (int i = StackLength(S);i > 0;i--) {
		LinkStack p = S->next;
		int j = 1;
		while (p && j < i) {
			p = p->next;
			++j;
		}
		visit(p->data);
	}
	printf("\n");
	return OK;
}

Status StackTraverse_Top(LinkStack S, Status(*pfn_visit)(SElemType)) {
	if (S->next == NULL) {
		printf("栈为空!\n");
		return ERROR;
	}
	LinkStack p = S->next;
	while (p) {
		pfn_visit(p->data);
		p = p->next;
	}
	printf("\n");
	return OK;
}

表达式求值主函数

#include "LinkStack.h"
#define OperandType char

Status visit(SElemType e) {
	printf(" %c", e);
	return OK;
}

//-----算法部分-----
//判定运算符栈的(栈顶运算符Θ1)与(读入的运算符Θ2)之间的优先关系

SElemType Precede(SElemType t1, SElemType t2) {
	SElemType t;
	switch (t1) {
	case '+':
	case '-':
		if (t2 == '*' || t2 == '/' || t2 == '(')
			t = '<';
		else t = '>';
		break;
	case '*':
	case '/':
		if (t2 == '(')
			t = '<';
		else t = '>';
		break;
	case '(':
		if (t2 == ')')
			t = '=';
		else if (t2 == '#')
			return ERROR;
		else t = '<';
		break;
	case ')':
		if (t2 == '(')
			return ERROR;
		else t = '>';
		break;
	case '#':
		if (t2 == ')')
			return ERROR;
		else if (t2 == '#')
			t = '=';
		else t = '<';
		break;
	}
	return t;
}

//进行二元运算aΘb
SElemType Operator(SElemType a, SElemType theta, SElemType b) {
	SElemType ret;
	switch (theta)
	{
	case '+':
		ret = (a - 48) + (b - 48) + 48;
		break;
	case '-':
		ret = (a - 48) - (b - 48) + 48;
		break;
	case '*':
		ret = (a - 48) * (b - 48) + 48;
		break;
	case '/':
		ret = (a - 48) / (b - 48) + 48;
		break;
	default:
		return NULL;
	}
	return ret;
}

Status In(SElemType c) {
	switch (c) {
	case'+':
	case'-':
	case'*':
	case'/':
	case'(':
	case')':
	case'#':
	case'=':
		return OK;
		break;
	default:
		return ERROR;
	}
}

//算法3.4
OperandType EvaluateExpression() {
	//算术表达式求值的算符优先算法。
	//设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
	LinkStack OPTR;//运算符栈:寄存运算符
	LinkStack OPND;//运算数栈:寄存操作数或运算结果
	//VS中变量上加注释,当鼠标移到下一次同变量的地方会显示注释
	char c, x, theta, a, b, e;
	InitStack(OPTR);
	InitStack(OPND);
	Push(OPTR, '#');
	c = getchar();
	GetTop(OPTR, e);
	while (c != '#' || e != '#') {
		if (!In(c)) {//运算数
			Push(OPND, c);
			c = getchar();
		}
		else {//运算符
			GetTop(OPTR, e);
			switch (Precede(e, c)) {
			case '<'://栈顶元素优先权低
				Push(OPTR, c);
				c = getchar();
				break;
			case '='://脱括号并接受下一个字符
				Pop(OPTR, x);
				c = getchar();
				break;
			case '>'://退栈并将运算结果入栈
				Pop(OPTR, theta);
				Pop(OPND, b);
				Pop(OPND, a);
				Push(OPND, Operator(a, theta, b));
				break;
			}
		}
		GetTop(OPTR, e);
	}
	GetTop(OPND, e);
	return e;
}

//运算数只能是一位自然数
int main(int argc, char** argv) {
	char c;
	c = EvaluateExpression();//3*5#=15
	printf("%d", c - 48);
	return 0;
}

测试结果

 

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

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

相关文章

Django学习笔记-django使用pandas将上传的数据存到MySQL

1.models中创建与excel表结构相同模型 2.模型映射 python manage.py makemigrations myapp01,python manage.py migrate 3.创建index,添加form,enctype使用multipart/form-data 4.urls中导入views,填写路由 5.views中创建index 6.如果为GET请求,直接返回index.html,如果为PO…

历史新知网:寄快递寄个电脑显示器要多少钱?

以下文字信息由&#xff08;新史知识网&#xff09;编辑整理发布。 让我们赶紧来看看吧&#xff01; 问题1&#xff1a;快递寄电脑显示器要多少钱&#xff1f; 此物有多重&#xff1f; 顺丰寄就可以了&#xff0c;但是必须是原包装的&#xff0c;不然不好寄。 问题2&#xff1…

阿里云中小企业扶持权益,助力企业开启智能时代创业新范式

在数字化浪潮的推动下&#xff0c;中小企业正面临着转型升级的重要关口。阿里云深知中小企业的挑战与机遇&#xff0c;特别推出了一系列中小企业扶持权益&#xff0c;旨在帮助企业以更低的成本、更高的效率拥抱云计算&#xff0c;开启智能时代创业的新范式。 一、企业上云权益…

光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测

光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测 目录 光伏预测 | Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测预测效果基本描述模型简介程序设计参考资料 预测效果 基本描述 Matlab基于CNN-SE-Attention-ITCN的多特征变量光伏预测 运行环境: Matla…

【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现

创建时间&#xff1a;2024-02-23 最后编辑时间&#xff1a;2024-02-24 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

Day04:APP架构小程序H5+Vue语言Web封装原生开发Flutter

目录 常见APP开发架构 APP-开发架构-原生态-IDEA APP-开发架构-Web封装-平台 APP-开发架构-H5&Vue-HBuilderX WX小程序-开发架构-Web封装-平台 WX小程序-开发架构-H5&Vue-HBuilderX 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服…

[CISCN 2019华东南]Web11

打开题目 看到xff就应该想到抓包 看回显也是127.0.0.1&#xff0c;我们盲猜是不是ssti模板注入 输入{{7*7}}显示49 可以看的出来flag在根目录下 输入{system(‘cat /flag’)} 得到flag 知识点&#xff1a; 漏洞确认 一般情况下输入{$smarty.version}就可以看到返回的smarty…

nebula容器方式安装:docker 安装nebula到windows

感谢阅读 基础环境安装安装docker下载nebula 安装数据库命令行安装查询network nebula-docker-compose_nebula-net并初始化查询安装初始使用root&#xff08;God用户类似LINUX的root&#xff09; 关闭服务 安装UI 基础环境安装 安装docker 点我下载docker 下载nebula 数据…

Python 实现Excel自动化办公(中)

在上一篇文章的基础上进行一些特殊的处理&#xff0c;这里的特殊处理主要是涉及到了日期格式数据的处理&#xff08;上一篇文章大家估计也看到了日期数据的处理是不对的&#xff09;以及常用的聚合数据统计处理&#xff0c;可以有效的实现你的常用统计要求。代码如下&#xff1…

Spring Boot项目误将Integer类型写成int来进行传参

在处理项目中Idea中无报错&#xff1a; 问题&#xff1a; localhost:8080/param/m2在浏览器中输入&#xff1a;localhost:8080/param/m2 产生报错&#xff1a; This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Feb 27 20:55…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED&#xff0c;计时LEDESP32基础控制&#xff1a;温控输出串口监控&#xff0c;LCD事件计数器&#xff0c;SD卡读写&#xff0c;扫描WiFi网络&#xff0c;手机控制LED&#xff0c;经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

使用 kubeadm 部署k8s集群

一、所有节点系统初始化 1、常规初始化 2、内核版本升级以及内核限制文件参数修改 还可以考虑将旧版本的内核卸载 二、准备nginx负载均衡器和keepalived nginx四层代理&#xff1a; keepalived配置&#xff1a; nginx检测脚本&#xff1a; 三、所有节点部署docker&#xff0c…

2023年06月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

一、单选题(共10题,共30分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A:编辑 B:保存 C:调试 D:编译 答案:D 第2题 默认小猫角色,执行下列程序,说法错误的是?( ) A:不按下空格键,小猫会随机移动 B:不按下空格…

高防IP简介

高防IP可以防御的有包括但不限于以下类型&#xff1a; SYN Flood、UDP Flood、ICMP Flood、IGMP Flood、ACK Flood、Ping Sweep 等攻击。高防IP专注于解决云外业务遭受大流量DDoS攻击的防护服务。支持网站和非网站类业务的DDoS、CC防护&#xff0c;用户通过配置转发规则&#x…

STM32F103学习笔记(六) RTC实时时钟(应用篇)

目录 1. RTC 实时时钟的应用场景 2. RTC 的配置与初始化 2.1 设置 RTC 时钟源 2.2 初始化 RTC 寄存器 2.3 中断配置 2.4 备份寄存器配置 2.5 校准 RTC 3. 实例演示代码 4. 总结 1. RTC 实时时钟的应用场景 实时时钟&#xff08;RTC&#xff09;在嵌入式系统中具有广泛…

html5盒子模型

1.边框的常用属性 border-color 属性 说明 示例 border-top-color 上边框颜色 border-top-color:#369; border-right-color 右边框颜色 border-right-color:#369; border-bottom-color 下边框颜色 border-bottom-color:#fae45b; border-left-color 左边框颜色…

phpldapadmin This base cannot be created with PLA

phpldapadmin This base cannot be created with PLA 1、问题描述2、问题分析3、解决方法&#xff1a;创建根节点 1、问题描述 安装phpldapadmin参考链接: https://blog.csdn.net/OceanWaves1993/article/details/136048686?spm1001.2014.3001.5501 刚安装完成phpldapadmin&…

括号生成(力扣题目22)

题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()&q…

备战蓝桥杯————k个一组反转单链表

k个反转单链表&#xff0c;顾名思义就是k个节点为一组进行反转&#xff0c;这是一道困难的题目&#xff0c;如何解答&#xff0c;可以在我们前面的反转链表中得到思路。 如何 K 个一组反转单链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xf…

STC-ISP原厂代码研究之 V3.7d汇编版本

最近在研究STC的ISP程序,用来做一个上位机烧录软件,逆向了上位机软件,有些地方始终没看明白,因此尝试读取它的ISP代码,但是没有读取成功。应该是目前的芯片架构已经将引导代码放入在了单独的存储块中,而这存储块有硬件级的使能线,在面包板社区-宏晶STC单片机的ISP的BIN文…