题解 | #表达式求值#

表达式求值

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;
}

全部评论

相关推荐

头像
04-09 14:29
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务