题解 | #表达式求值#中缀表达式C语言求解
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
中缀表达式,建立两个栈,分别是数字栈和符号栈。
遇到数字直接入栈,
遇到符号栈需要判断,当符号是‘(’时直接入栈;当符号是‘)’时,直接出栈,直到遇到‘(’;遇到高优先级入栈,遇到低优先级出栈。
代码实现如下:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
//定义数组大小
#define MAXSIZE 100
//判断表达式的优先级,a的优先级高于b返回0,否则返回1;
int symcmp(char a, char b) {
if (b == '(')
return 1;
else if ((b == '*' || b == '/') && (a == '+' || a == '-' || a == '('))
return 1;
else if ((b == '+' || b == '-') && (a == '('))
return 1;
else
return 0;
}
//计算运算值栈顶两个元素(a栈顶第一个元素,b栈顶第二个元素)
int calculate(char c, int a, int b) {
int tmp = 0;
switch (c) {
case '+':
tmp = b + a;
break;
case '-':
tmp = b - a;
break;
case '*':
tmp = b * a;
break;
case '/':
tmp = b / a;
break;
}
return tmp;
}
int solve(char* s ) {
int num_stack[MAXSIZE]; //运算值栈
int num_top = -1; //运算值栈指针
char sym_stack[MAXSIZE]; //操作符栈
int sym_top = -1; //操作符栈指针
int i = 0;
while (s[i] != '\0') {
if (isdigit(s[i])) {
//数字进入数字栈
int val = 0;
while (isdigit(s[i])) {
val = val * 10 + s[i] - '0';
i++;
}
num_stack[++num_top] = val;
} else {
//符号进入符号栈
if (s[i] == ')') {
//遇到‘)’开始出栈至到遇到‘(’
while (sym_stack[sym_top] != '(') {
int ret = calculate(sym_stack[sym_top], num_stack[num_top],
num_stack[num_top - 1]);
sym_top--;
num_top -= 2;
num_stack[++num_top] = ret;
}
sym_top--;
i++;
} else if (!symcmp(sym_stack[sym_top], s[i])) {
//遇到了+-*/,判断优先级,如果栈顶符号的优先级高,则进行运算
while (sym_top > -1 && (!symcmp(sym_stack[sym_top], s[i]))) {
int ret = calculate(sym_stack[sym_top], num_stack[num_top],
num_stack[num_top - 1]); //计算栈顶两个元素
sym_top--;
num_top -= 2;
num_stack[++num_top] = ret;
}
sym_stack[++sym_top] = s[i];
i++;
}
else {
//没啥特殊情况,直接入栈
sym_stack[++sym_top] = s[i];
i++;
}
}
}
while (sym_top > -1) {
//计算栈顶两个元素
int ret = calculate(sym_stack[sym_top], num_stack[num_top], num_stack[num_top - 1]);
sym_top--;
num_top -= 2;
num_stack[++num_top] = ret;
}
return num_stack[0];
}



查看16道真题和解析