题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int compute(string& s, int left, int right) {
    char op = '+'; //默认加开始
    int num = 0;
    vector<int> st;
    for (int i = left; i <= right; i++) {
        if (isdigit(s[i])) //数字
            num = num * 10 + s[i] - '0'; //计算该部分数字总和
        if (s[i] == '(') { //进入左括号
            int layer = 0; //统计左括号层数
            int j = i;
            while (j <= right) { //遍历到右边
                if (s[j] == '(')
                    layer++; //遇到左括号,层数累加
                else if (s[j] == ')') {
                    layer--; //遇到右括号层数递减
                    if (layer == 0) //直到层数为0
                        break;
                }
                j++;
            }
            num = compute(s, i + 1, j - 1); //递归计算括号中的部分
            i = j + 1;
        }
        if (!isdigit(s[i]) || i == right) { //遇到运算符或者结尾
            switch (op) { //根据运算符开始计算
                case '+':
                    st.push_back(num);
                    break; //加减法加入到末尾
                case '-':
                    st.push_back(-num);
                    break;
                case '*':
                    st.back() *= num;
                    break; //乘除法与末尾计算
                case '/':
                    st.back() /= num;
                    break;
            }
            op = s[i]; //修改为下一次的运算符
            num = 0;
        }
    }
    int res = 0;
    for (int x : st) //累加和
        res += x;
    return res;
}
int main() {
    string s;
    while (cin >> s) {
        cout << compute(s, 0, s.length() - 1) << endl;
    }
    return 0;
}

全部评论

相关推荐

Rena1ssanc...:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务