中序计算式的计算器模型C语言实现

2023-05-16

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <stdbool.h>

#define INIT_SIZE 100
#define INCRE_SIZE 10
#define OPERAND 1
#define OPERATOR 2

char _BUFFER[1000];
int _POS;

char myGetchar();
void myUnGetchar(char c);

typedef enum operator_et
{
	LBR,  // 左括号
	RBR,  // 右括号
	ADD,  // 加
	SUB,  // 减
	MUL,  // 乘
	DIV,  // 除
	INV,  // 乘方
	SIN,  // sin
	COS,  // cos
	END   // 结束标志
}operator_et;

typedef double data_t;
typedef struct cal_t
{
	data_t *operand;
	int *operator;
	int operand_size;
	int operator_size;
	int operand_top;
	int operator_top;
}cal_t;
typedef cal_t* cal_pt;

// 初始化栈
cal_pt calInit();
// 销毁栈
void calFree(cal_pt cal);
// 压进操作符
void calOperatorPush(operator_et operator, cal_pt cal);
// 弹出操作符
operator_et calOperatorPop(cal_pt cal);
// 压进操作数
void calOperandPush(data_t operand, cal_pt cal);
// 弹出操作数
data_t calOperandPop(cal_pt cal);
// 操作符优先级比较,优先级大于栈顶返回1,相等返回0,小于返回-1
int operatorCmp(operator_et top, operator_et op);
// 给操作数,进行计算
void work(operator_et op, cal_pt cal);
// 获取操作符或者操作数,返回类型
int getop(char *op);
// 主逻辑函数,进行运算
void calculator(cal_pt cal);
void __calculator(operator_et op, cal_pt cal);

int main()
{
	cal_pt cal = calInit();
	scanf("%s", _BUFFER);
	_POS = 0;
	calculator(cal);
	// 计算完成。数据栈里唯一的数字就是所需要的数据
	printf("%.3lf\n", calOperandPop(cal));
	calFree(cal);
	return 0;
}

void __calculator(operator_et op, cal_pt cal)
{
	switch(operatorCmp(cal->operator[cal->operator_top], op))
	 {
	 	case 1:  // 新运算符优先级更大,压入
	 	{
	 		calOperatorPush(op, cal);
	 		break;
	 	}
	 	case -1:  // 新运算符优先级更小,弹出计算直至没有比它更大的运算符
	 	{
	 		do
	 		{
	 			work(calOperatorPop(cal), cal);
	 		}while(operatorCmp(cal->operator[cal->operator_top], op) == -1);
	 		__calculator(op, cal);
	 		break;
	 	}
	 	case 0:  // 只有当运算符为括号或结束符时才会出现。弹出运算符,不做操作
	 	{
	 		calOperatorPop(cal);
	 		break;
	 	}
	 }
}

char myGetchar()
{
	return _BUFFER[_POS ++];
}

void myUnGetchar(char c)
{
	_POS -= 1;
}

void calculator(cal_pt cal)
{
	bool isOver = false;
	char opString[20];
	int type;
	while (!isOver)
	{
		type = getop(opString);
		if (type == OPERAND)
		{
			calOperandPush(atoi(opString), cal);
		}
		else
		{
			switch(opString[0])
			{
				case '+':
				{
					__calculator(ADD, cal);
					break;
				}
				case '-':
				{
					__calculator(SUB, cal);
					break;
				}
				case '*':
				{
					__calculator(MUL, cal);
					break;
				}
				case '/':
				{
					__calculator(DIV, cal);
					break;
				}
				case '^':
				{
					__calculator(INV, cal);
					break;
				}
				case 'c':
				{
					__calculator(COS, cal);
					break;
				}
				case 's':
				{
					__calculator(SIN, cal);
					break;
				}
				case '(':
				{
					__calculator(LBR, cal);
					break;
				}
				case ')':
				{
					__calculator(RBR, cal);
					break;
				}
				case '#':
				{
					isOver = true;
					__calculator(END, cal);
					break;
				}
			}
		}
	}
}

int getop(char *op)
{
	int pos = 0;
	char c = myGetchar();
	// 去除空白字符串
	while (isblank(c))
	{
		c = myGetchar();
	}
	// 判断是字符还是数字
	if (isdigit(c))
	{
		while (isdigit(c))
		{
			op[pos ++] = c;
			c = myGetchar();
		}
		myUnGetchar(c);
		op[pos] = '\0';
		return OPERAND;
	}
	op[pos ++] = c;
	op[pos] = '\0';
	if (op[0] == 'c' || op[0] == 's')  // cos或sin吸收后面的两个符号
	{
		myGetchar();
		myGetchar();
	}
	return OPERATOR;
}

void work(operator_et op, cal_pt cal)
{
	switch(op)
	{
		case ADD:  // 加法运算,弹出两个操作数,运算后压回去
		{
			calOperandPush(calOperandPop(cal) + calOperandPop(cal), cal);
			break;
		}
		case SUB: // 减法运算
		{
			data_t tmp = calOperandPop(cal);
			calOperandPush(calOperandPop(cal) - tmp, cal);
			break;
		}
		case MUL: // 乘法运算
		{
			calOperandPush(calOperandPop(cal) * calOperandPop(cal), cal);
			break;
		}
		case DIV: // 除法运算
		{
			data_t tmp = calOperandPop(cal);
			calOperandPush(calOperandPop(cal) / tmp, cal);
			break;
		}
		case INV: // 乘方运算
		{
			data_t tmp = calOperandPop(cal);
			calOperandPush(pow(calOperandPop(cal), tmp), cal);
			break;
		}
		case SIN: // 正弦运算
		{
			calOperandPush(sin(calOperandPop(cal)), cal);
			break;
		}
		case COS: // 余弦运算
		{
			calOperandPush(cos(calOperandPop(cal)), cal);
		}
	}
}

int operatorCmp(operator_et top, operator_et op)
{
	// 规则:
	// 1. 栈顶元素是左括号时,除右括号外任何操作符优先级大于栈顶元素。碰到结束符则说明输入错误
	// 2. 新操作符是左括号时,左括号优先级大于任何栈顶元素
	// 3. 新操作符是右括号时,除左括号外右括号小于任何栈顶元素
	// 4. 同级别操作符,除了括号与结束符相等外,新操作符优先级均小于栈顶元素
	// 5. 结束符的优先级小于所有的运算符
	// 6. 优先级排序(不包括括号):结束符,加减法,乘除,乘方、三角函数
	int res;
	switch(op)
	{
		case LBR:  // 新操作符是左括号时,左括号优先级大于任何栈顶元素
		{
			res = 1;
			break;
		}
		case RBR:  // 新操作符是右括号时,除左括号外右括号小于任何栈顶元素
		{
			res = (top == LBR) ? 0 : -1;
			break;
		}
		case END:  // 最低级的运算符,将所有栈内元素取出
		{
			if (top == LBR)
			{
				fprintf(stderr, "wrong Input!\n");
				exit(-1);
			}
			res = (top == END) ? 0 : -1;
			break;
		}
		case ADD:
		case SUB:  // 次低级的运算符,大于结束符与栈顶左括号,小于其它任何运算符
		{
			res = (top == END || top == LBR) ? 1 : -1;
			break;
		}
		case MUL:
		case DIV:  // 大于结束符、栈顶左括号、加法与减法,小于其它任何运算符。小于COS、SIN、INV、同级别运算符
		{
			return (top == END || top == LBR || top == ADD || top == SUB) ? 1 : -1;
			break;
		}
		case INV:  // 次高级运算符,仅仅小于三角函数、同级别运算符,大于任何其它级别运算符
		{
			res = (top == COS || top == SIN || top == INV) ? -1 : 1;
			break;
		}
		case COS:
		case SIN:  // 最高级别运算符,直接压入,小于同级别
		{
			res = (top == COS || top == SIN) ? -1 : 1;
			break;
		}
	}
	return res;
}

data_t calOperandPop(cal_pt cal)
{
	return *(cal->operand + cal->operand_top --);
}

void calOperandPush(data_t operand, cal_pt cal)
{
	if (++ cal->operand_top >= cal->operand_size)
	{
		cal->operand_size += INIT_SIZE;
		cal->operand = (data_t *)realloc(cal->operand, sizeof(data_t) * cal->operand_size);
	}
	*(cal->operand + cal->operand_top) = operand;
}

operator_et calOperatorPop(cal_pt cal)
{
	return *(cal->operator + cal->operator_top --);
}

void calOperatorPush(operator_et operator, cal_pt cal)
{
	if (++ cal->operator_top >= cal->operator_size)
	{
		cal->operator_size += INCRE_SIZE;
		cal->operator = (int *)realloc(cal->operator, sizeof(int) * cal->operator_size);
	}
	*(cal->operator + cal->operator_top) = operator;
}

void calFree(cal_pt cal)
{
	free(cal->operator);
	free(cal->operand);
	cal->operator = NULL;
	cal->operand = NULL;
	cal->operator_size = cal->operand_size = 0;
	cal->operator_top = cal->operand_top = -1;
}

cal_pt calInit()
{
	cal_pt cal = (cal_pt)malloc(sizeof(cal_t));
	cal->operator_size = cal->operand_size = INIT_SIZE;
	cal->operator_top = cal->operand_top = -1;
	cal->operator = (int*)malloc(sizeof(int) * INIT_SIZE);
	cal->operand = (data_t *)malloc(sizeof(data_t) * INIT_SIZE);
	calOperatorPush(END, cal);
	return cal;
}

代码解释

首先,建立一个全局字符串数组BUFFUR,以便进行字符串操作
其次,建立两个栈:操作数栈与操作符栈
总体的流程如下:

  1. 取出一个操作数或操作符,
  2. 如果是操作数,则直接压入操作数栈
  3. 如果是操作符,与栈顶元素进行优先级比较(操作符栈在初始化时加入了一个结束符#方便计算)
  4. 若新操作符的优先级更大,则压入栈
  5. 若新操作符的优先级更小,则将栈顶元素弹出进行运算,然后再回到第三步
  6. 若新操作符的优先级等于栈顶元素,则弹出栈顶元素(不进行运算)
  7. 回到1,直至取到#,执行最后一次操作、清空操作符栈后结束

优先级比较的规则:

  1. 总体优先级(从低到高):结束符#,加减法,乘除法,乘方运算,三角函数运算
  2. 当栈顶元素与新操作符优先级相同时,除非新元素为括号或#,否则默认新操作符的优先级更低
  3. 当栈顶元素为左括号时,除了右括号优先级与其相同外,任何操作符优先级均高于栈顶元素。若碰到结束符#,则说明输入括号不匹配,报错退出
  4. 当新元素为左括号时,默认其优先级高于任何运算符
  5. 当新元素为右括号时,默认其优先级低于除了左括号外的任何运算符

举例:70+cos(3+2/2/3^2-1)*(4-3)#
操作符栈事先加入了一个#方便计算

  1. 取操作数70,压入栈,操作数栈:70
  2. 取操作符+,优先级高于#,压入栈,此时操作符栈:#, +
  3. 取操作符cos,优先级高于+,压入栈,此时操作符栈:#, +, cos
  4. 取操作符(,默认优先级高于任何操作符,压入栈,此时操作符栈:#, +, cos, (
  5. 取操作数3,压入栈,操作数栈:70, 3
  6. 取操作符+,默认优先级高于栈顶元素(,压入栈,此时操作符栈:#, +, cos, (, +
  7. 取操作数2,压入栈,操作数栈:70, 3, 2
  8. 取操作符/,优先级高于+,压入操作符栈:#, +, cos, (, +, /
  9. 取操作数2,压入操作数栈:70, 3, 2, 2
  10. 取操作符/,优先级等于/,默认小于栈顶元素,弹出栈顶/,弹出操作数栈中的22,执行计算2/2,将结果1压入栈:70, 3, 1。新操作符/优先级大于+,压入栈:#, +, cos, (, +, /
  11. 取操作数3压入:70, 3, 1, 3
  12. 取操作符^,优先级高于/,压入栈:#, +, cos, (, +, /, ^
  13. 取操作数2压入:70, 3, 1, 3, 2
  14. 取操作符-,优先级小于^,弹出^与对应操作数,执行计算3^2,将结果9压入栈:70, 3, 1, 9
  15. 操作符-优先级小于/,弹出/执行计算1/9,将结果0.3333压入栈:70, 3, 0.1111
  16. 操作符-与操作符+同级,依照规则默认小于栈顶,弹出+,执行计算3+0.1111,压入结果:70, 3.1111
  17. 将操作符-压入栈:#, +, cos, (, -
  18. 获取操作数1:70, 3.1111, 1
  19. 获取操作符),默认小于除了左括号外所有运算符,弹出-执行计算,结果:70, 2.1111
  20. 弹出操作符(
  21. 获取操作符*,优先级小于cos,弹出cos执行运算:70, -0.514,因为*优先级大于+,压入栈:#, +, *
  22. 取括号(,依据规则压入栈
  23. 取操作数4压入栈
  24. 取操作符-依据规则压入栈
  25. 取操作数3压入栈
  26. 取操作符),依据规则弹出-进行计算,得4-3=1,压入栈:70, -0.514, 1
  27. 取得操作符#,按照顺序弹出所有操作符:-0.541 * 1 = -0.54170 + (-0.514) 69.486
  28. 计算结束

扩展:逆波兰式

链接:逆波兰式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中序计算式的计算器模型C语言实现 的相关文章

  • 【C、C++系列-1】C语言实现:寻找[1,100]之间的素数

    C C 43 43 系列 1 C语言实现 xff1a 寻找 1 100 之间的素数 1 问题 C语言实现 xff1a 寻找 1 100 之间的素数 2 实现代码 span class token comment 寻找 1 100 之间的素数
  • <操作系统>读者写者问题(读者优先)C语言实现

    问题描述 代码 span class token macro property span class token directive keyword include span span class token string lt stdio
  • 辗转相除法详解(C语言实现)

    辗转相除法 定义基本原理原理证明 算法实现思想C语言实现 定义 辗转相除法 xff0c 被称为欧几里得 xff08 Euclidean xff09 算法 xff0c 是求最大公约数的算法 基本原理 原理 两个正整数a和b a gt b xf
  • 选择排序算法(C语言实现)

    include lt stdio h gt void choice int a int n int i j temp for i 61 0 i lt n 1 i 43 43 for j 61 i 43 1 j lt n j 43 43 if
  • 使用汇编语言与C语言实现LED1/LED2/LED3三盏灯点亮

    汇编语言代码段 text global start start LED13 INIT LED1 3点灯 RCC章节 64 1 设置GPIO始终使能 通过RCC AHB4ENSRTR寄存器设置0x50000A28 4 61 1 ldr r0
  • C语言实现16进制数与10进制数的转化

    C语言实现16进制数与10进制数的转化 这里有两种情况 xff1a 第一种情况 xff1a 如果我得到的是一个16进制数 xff0c 我通过肉眼看到的就是16进制显示 xff08 这里看到的肯定打印结果 xff09 xff0c 比如85 x
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • 记录:在ubuntu中以C语言实现json文件读取遇到的问题(1)(说不定会有2)

    4 12 记录在ubuntu中以C语言实现json文件读取遇到的问题 xff08 1 xff09 xff08 说不定会有2 xff09 暂记录遇到的问题及解决 xff0c 其中还有些原因没有搞明白 xff09 1 首先过程参考自一位大佬的博
  • PID连续控制算法的表达式以及C语言实现

    1 数字 xff08 离散 xff09 PID控制算法的表达式 xff1a 将PID调节器离散化 xff0c 用差分方程来代替连续系统的微分方程 xff0c 分为位置式和增量式两类 重点理解概念如下 xff1a a xff09 基本偏差e
  • C语言实现http请求器

    C语言实现http请求器 项目介绍 本项目完成一个http客户端请求器 xff0c 该请求器往服务器发送请求 xff0c 并接受服务器发来的响应数据 程序执行流程 建立TCP连接在TCP连接获得的socket的基础上 xff0c 发送htt
  • PID控制算法的C语言实现

    PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题 xff0c 发现网络上尚没有一套完整的比较体系的讲解 于是总结了几天 xff0c 整理一套思路分享给大家 在工业应用中PID及其衍生算法是应用最广泛的
  • C++/C语言实现HTTP的GET和POST请求

    阅读目录 HTTP请求和IP TCP 实现GET请求 实现POST请求 xff1a 参考 xff1a 回到顶部 HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建sock
  • C语言实现http post请求和get请求,post请求可以上传图片和文件

    文章目录 1 http协议简介2 http协议分析2 1 http请求2 1 1 请求行2 1 1 1 请求方法2 1 1 2 URL2 1 1 3 协议版本2 1 1 4 请求行总结 2 1 2 请求头部2 1 3 请求数据 2 2 ht
  • C语言实现“井字棋”游戏(三子棋)人机对弈

    井字棋游戏 xff1a 即三子棋 xff0c 英文名叫Tic Tac Tic xff0c 是一种在3 3格子上进行的连珠游戏 xff0c 和五子棋比较类似 xff0c 由于棋盘一般不画边线框 xff0c 格线排成井字故得名 题目分析 xff
  • windows下C语言实现TCP通信

    编译器 xff1a vs2017 语言 xff1a c语言 具体的原理可以在其他博客看到 在我学习winsock编程时 xff0c 发现那些博客代码居然在我机器上没一个能运行 xff0c 可能是我水平有限 于是我根据winsock相关知识
  • C语言实现1/1-1/2+1/3-...-1/100求和

    观察题目要求可以看出 xff0c 底数为奇数是前面符号为正 xff0c 偶数是则为负 那么我们可以考虑使用一下方式完成求解 解法一 xff1a span class token macro property span class token
  • c 语言udp方式连接代码,C语言实现UDP连接的参考代码

    C语言实现UDP连接的参考代码 xff0c Client连接上Server后将自己所在目录下的 34 liu 34 文件中的前三行文字发送到Server端去 xff0c 然后Server负责接收和显示 server c include in
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 用c语言实现https通信,C/C++实现HTTPS通信

    include 34 afxinet h 34 CInternetSession mysession CHttpConnection myconn CString VoidText CString strSentence strGetSen
  • 二叉树递归遍历(C语言实现)

    span class token macro property span class token directive hash span span class token directive keyword include span spa

随机推荐

  • 嘘,我发现了互联网流量变现提升的秘籍

    变现 难 xff0c 难于上青天 我想如果李白生活在当下移动互联网时代 xff0c 一定会再度创作经典诗篇 变现难 虽然话是玩笑话 xff0c 但情况确实如此 我是一个小企业的APP开发者 xff0c 在波云诡谲的互联网时代 xff0c 对
  • 存量市场下的互动广告:让“互动+”成为可能

    被称为 第四代互联网广告 的互动广告一改以往传统广告单向的传播 xff0c 通过互动 交流进行双向传播 xff1b 用户也从被动的观看者转变为主动的参与者 xff0c 直观地体验产品的核心功能 xff0c 由于诸此种种优势使得目前行业内互动
  • 流量变现频频受阻?试试GroMore!

    每个APP开发者最希望的事情便是将自身平台的流量变现收益最大化 不过 xff0c 实现这一希望可谓是 道阻且长 xff0c 因为流量变现路上 成本高 效率低 优化难 这三大拦路虎来势汹汹 针对流量变现的三大痛点 xff0c 开发者应该应对
  • 这个暑假,我用这个特效制作软件赚了“第一桶金”

    暑假已经过了一个月了 xff0c 在这一个月里 xff0c 感觉自己做了一件大事 挣钱 作为一名优秀的当代大学生 xff0c 总是希望自己能够通过自己的努力获得一些什么 在学长的推荐下 xff0c 我还是放弃了 卖苦力 的赚钱方式 xff0
  • 短视频特效创作,带给我的不只幸福感

    要说现在抖音是年轻人最喜爱的社交媒体之一 xff0c 应该没有人反对吧 xff1f 要说我最喜欢抖音里的什么内容 xff0c 一定是各种奇奇怪怪的特效啦 也正是因为喜欢这些短视频特效 xff0c 我还特别去研究了一下它们是怎样被创作出来的
  • 抖音特效开放平台,点满我的短视频特效创作技能

    记得刚开始玩儿抖音的时候 xff0c 最喜欢看的就是技术流大拿们做的特效视频 xff0c 并且跃跃欲试想要加入他们 xff0c 奈何自己实在没有这么强的技术 再到后来 xff0c 抖音就推出了短视频特效道具 xff0c 我一直觉得 xff0
  • 怎么做视频特效?不妨试试抖音特效创作平台

    在这个信息满天飞的时代 xff0c 如何吸引用户主动的去接收信息对于内容生产来说至关重要 xff0c 从相关资料了解到 xff0c 视频是目前大家最喜欢的信息呈现方式 xff0c 一个有趣的视频可能会吸引成千上万用户的注意力 引爆整个网络场
  • 从0开始的视频特效制作之路

    随着短视频的火爆 xff0c 特效也随之火热了起来 作为短视频的重要玩法之一 xff0c 特效不仅降低了短视频拍摄制作的门槛 xff0c 还让用户的短视频形式丰富了起来 而最近爆火的 奶瓶面膜 视频特效 xff0c 更是给视频特效的出圈加了
  • 如何实现广告精准投放?一文获得新思路

    随着互联网人口红利的持续衰减 xff0c 互联网用户数量的增长速度越来越慢 市场进入存量 xff0c 用户们对产品质量要求越来越高 面对这样的市场阶段 xff0c APP开发者们做好广告精准投放是很有必要的 精准地广告投放在减少广告预算浪费
  • 激励视频广告——移动应用的财富密钥

    如何良好地平衡用户体验和用户增长 是广告行业的持久命题 xff0c 上网搜索 激励视频广告 你会发现类似的问题层出不穷 xff1a 请问什么是激励视频广告 xff1f 谁能麻烦介绍一下吗 xff1f 激励视频广告哪家做的好 xff1f 跪求
  • 设计模式详解:模式汇总与索引清单

    从本篇开始 xff0c 和您一起进入设计模式的世界 之前用C 做微信微信公众号开发系列文章 xff0c 更多的是原生模式 xff0c 帮助猿友们理解业务流程和基本实现方法 xff0c 但是那些类的实现仍然是用面向过程的思维方式 xff0c
  • 如何稳步实现互联网流量变现?

    我突然想起了自己刚做开发的时候 xff0c 那会还是菜鸟的我为了快速获取流量 最大程度的变现 xff0c 基本上不会考虑所谓的用户体验 xff0c 满脑子都是怎么引流 怎么变现 xff0c 所以常常引起用户反感 xff0c 严重折损了用户体
  • 一文获悉互动广告的投放攻略

    一直以来 xff0c 顶着 第四代互联网广告 头衔的 互动广告 通过互动 交流等方式进行双向传播 xff0c 一改以往传统广告的单向线性传播 xff0c 与此同时 xff0c 用户也从被动的观看者转变为主动的参与者 xff0c 直观地体验产
  • 穿山甲成长中心——人能尽其才则百事兴

    对于一众APP开发者来说 xff0c 要想在激烈的市场竞争中突出重围 xff0c 得到用户的青睐 xff0c 往往要面临重重困难 缺乏广告资源 xff0c 流量变现困难等着问题都使得开发者在刚刚进入市场时没有机会展现自己从而停滞不前 每一个
  • 广告精准投放的新出路为何?

    众所周知 xff0c 当前广告行业呈现普遍性的跨媒体投放 xff0c 测试成本 管理成本较高 xff0c 存在信息孤岛等情况 xff0c 一众广告主们通过数据分析优化投放的难度较大 在各类引擎中搜索 广告精准投放 xff0c 诸如 如何以更
  • 互联网流量变现出路为何?一文浅析

    国庆小长假在各大广告主和开发者们眼里就是一座巨大的流量富矿 xff0c 以国庆为主题推的广告和软件层出不穷 我突然想起了我自己刚做开发的时候 xff0c 那会还是菜鸟的我为了快速获取流量 最大程度的变现 xff0c 基本上不会考虑所谓的用户
  • MyBatisPlus 入门学习笔记(版本:3.4.3)

    文章目录 学习辅助资料 MyBatisPlus概述1 MyBatisPlus是什么2 特性 快速开始1 创建数据库 96 mybatis plus 96 2 导入相关依赖3 数据源配置3 快速开始3 1 User实体类编写3 2 mappe
  • Shell自动化脚本学习

    目录 xff08 1 6 xff09 Linux Shell脚本的自动化编程之shell xff1a 命令排序 xff08 1 7 xff09 Linux Shell脚本的自动化编程之shell xff1a 通配符 xff08 2 1 xf
  • ROS创建工作空间及功能包流程总结整理(python)

    ROS创建工作空间及功能包流程总结整理 xff08 python xff09 参考资料 xff1a B站赵虚左 xff1a https www bilibili com video BV1Ci4y1L7ZZ p 61 19 amp vd s
  • 中序计算式的计算器模型C语言实现

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp