题解 | #表达式求值#

表达式求值

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

#include <algorithm>
#include <cctype>
#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int cal(int a, int b, char fu) {
    if (fu == '+') return a + b;
    if (fu == '-') return a - b;
    if (fu == '*') return a * b;
    if (fu == '/') return a / b;
    return 0;
}
int cal4(vector<string>& res) {
    if (res.size() == 1) return stoi(res[0]);
    reverse(res.begin(), res.end());
    if (res[0] == "-") res.insert(res.begin(), "0");

    for (int i = 0; i < res.size(); i++) {
        if (res[i] == "*" || res[i] == "/") {
            // cout << res[i - 1] <<" "<< res[i + 1]<<endl;
            int tem = cal(stoi(res[i - 1]), stoi(res[i + 1]), res[i][0]);
            res[i - 1] = to_string(tem);
            res.erase(res.begin() + i, res.begin() + i + 2);
            i--;
        }
    }
    int last = stoi(res[0]);
    for (int i = 0; i < res.size(); i++) {
        if (res[i] == "+" || res[i] == "-") {
            last = cal(last, stoi(res[i + 1]), res[i][0]);
        }
    }
    return last;
}
int main() {
    string s;
    while (cin >> s) { // 注意 while 处理多个 case
        stack<string> b;
        int last_fu = -1;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '(' ||
                    s[i] == ')') {
                // cout << s[i] << endl;
                b.push(s.substr(last_fu + 1, i - last_fu - 1));
                string tem = "1";
                tem[0] = s[i];
                b.push(tem);
                last_fu = i;
            }
            if (s[i] == ')') {
                b.pop();//右括号
                vector<string> sub;
                while (b.top() != "(") {
                    if(!b.top().empty())sub.push_back(b.top());
                    b.pop();
                }
                b.pop();//左括号
                // for (auto &i : sub) cout <<i;
                int cal_ = cal4(sub);
                b.push(to_string(cal_));
            }
        }
        if (isdigit(s.back())) b.push(s.substr(last_fu + 1, s.size() - 1 - last_fu));

        vector<string> res;
        while (!b.empty()) {
            if(!b.top().empty())res.push_back(b.top());
            b.pop();
        }
        cout << cal4(res);

    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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