题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ int solve(char* s ) { // write code here int stack[100] = { 0 }; //数据栈 char syb[100] = { 0 }; //符号栈 int ntop = -1, stop = -1; //数据栈顶,符号栈顶 int num; while (1) { num = 0; if (*s >= '0' && *s <= '9') { //遇到数字 while (*s >= '0' && *s <= '9') { //字符串转数字 num = num * 10 + (*s - '0'); ++s; } if (stop != -1 && syb[stop] == '-') { //减法当做加相反数 syb[stop] = '+'; num = -num; } stack[++ntop] = num; //数据入栈 } if (stop != -1 && syb[stop] == '*') { //先算乘法 stack[ntop - 1] *= stack[ntop]; --ntop; --stop; } if (*s == '\0') break; while (*s && (*s < '0' || *s > '9')) { //遇到符号 if (*s == ')') { //遇到右括号 while (syb[stop] != '(') { //计算括号中的数据 stack[ntop - 1] += stack[ntop]; --ntop; --stop; } --stop; if (syb[stop] == '*') { //计算括号前面的乘法 如 2*(2+3)-1 stack[ntop - 1] *= stack[ntop]; --ntop; --stop; } if (syb[stop] == '-') { //变换括号前面的减法如 2 - ( 2 + 3) - 1--> 2 + -6 - 1 stack[ntop] = -stack[ntop]; syb[stop] = '+'; } } else { //符号入栈 syb[++stop] = *s; } ++s; } } num = 0; while (ntop != -1) num += stack[ntop--];//计算数据栈剩余的数据之和 return num; }