题解 | #表达式求值#

表达式求值

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

#include <iostream>
#include <sstream>
#include <stack>
#include <string>
using namespace std;
int stringtoint(string str) {
    istringstream s(str);
    int temp;
    s >> temp;
    return temp;
}
void compute(stack<int>& nums, stack<char>& opers) {
    int later = nums.top();
    nums.pop();
    int former = nums.top();
    nums.pop();
    char oper = opers.top();
    opers.pop();
    int z;
    switch (oper) {
        case '+':
            z = former + later;
            break;
        case '-':
            z = former - later;
            break;
        case '*':
            z = former * later;
            break;
        case '/':
            z = former / later;
            break;
    }
    nums.push(z);
}
bool priority_first_last(char first, char last) {
    if (last == '(' || first == '(') {
        return false;
    }
    if ((first == '+' || first == '-') && (last == '*' || last == '/')) {
        return false;
    }
    return true;
}
int main() {
    string input;
    cin >> input;
    stack<int> nums;
    stack<char> opers;
    bool last_is_oper = true;
    for (int i = 0; i < input.size(); i++) {
        if (input[i] == ')') {
            while (opers.top() != '(') {
                compute(nums, opers);
            }
            opers.pop();
        }  else if (last_is_oper) {
            int j = i;
            if (input[i] == '-' || input[i] == '+') {
                i++;
            }
            while (isdigit(input[i])) {
                i++;
            }
            if (i != j) {
                string temp = input.substr(j, i - j);
                nums.push(stringtoint(temp));
            }
            i--;
            last_is_oper = false;
        } else {
            while (opers.empty() == false && priority_first_last(opers.top(), input[i])) {
                compute(nums, opers);
            }
            opers.push(input[i]);
            last_is_oper = true;
        }
    }//for
    while (opers.empty() == false) {
        compute(nums, opers);
    }
    cout << nums.top();
}

全部评论

相关推荐

07-01 23:23
郑州大学 Java
否极泰来来来来:牛客迟早有高三的
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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