字符串表达式可被解析包含加减乘除取模和次幂运算的数学表达式
实现一个简单的表达式求值器,
例如char expression[] = "(27%4-2)*2+1";
可以解析包含加减乘除取模和次幂运算的数学表达式,
并计算出最终结果。通过递归解析表达式中的数字和运算符,
并按照运算符的优先级进行计算,最终输出表达式的计算结果。
先行判断优先级,再考虑运算的过程。
最终实现字符串表达式可被解析成真实的数学表达式并得出结果。
#include <stdio.h>
#include <ctype.h>
#include <math.h> // 引入pow函数
// 函数声明
int evaluate(char **s);
// 解析数字,包括括号内的表达式
int parseNumber(char **s) {
if (**s == '(') {
(*s)++; // 跳过左括号
int num = evaluate(s); // 计算括号内的表达式
(*s)++; // 跳过右括号
return num;
} else {
int num = 0;
while (isdigit(**s)) {
num = 10 * num + (**s - '0');
(*s)++;
}
return num;
}
}
// 处理次幂运算
int evaluatePower(char **s) {
int base = parseNumber(s);
while (**s == '^') {
(*s)++; // 跳过'^'
int exponent = parseNumber(s); // 解析指数
base = (int) pow((double) base, (double) exponent);
}
return base;
}
// 处理乘除求模运算
int evaluateMD(char **s) {
int num = evaluatePower(s); // 先处理可能的次幂运算
while (**s == '*' || **s == '/' || **s == '%') {
char op = *(*s)++;
int nextNum = evaluatePower(s); // 对于乘除,也要先处理次幂
if (op == '*') {
num *= nextNum;
} else if (op == '/') {
num /= nextNum;
} else {
num %= nextNum;
}
}
return num;
}
// 评估整个表达式
int evaluate(char **s) {
int result = evaluateMD(s);
while (**s && **s != ')' && **s != '%') {
// 修改条件,确保在遇到右括号或求模运算符时停止
char op = *(*s)++;
if (op == '+' || op == '-') {
int nextNum = evaluateMD(s);
if (op == '+') {
result += nextNum;
} else {
result -= nextNum;
}
}
}
return result;
}
// 主函数
int main() {
char expression[] = "(27%4-2)*2+1";
char *p = expression;
int result = evaluate(&p);
printf("结果是: %d\n", result);
return 0;
}