题解 | #表达式求值 双栈+递归,非常简洁易懂#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

双栈+递归

双栈:一个栈用于存放数字,一个用于存放符号

递归:括号内表达式求值作为返回值,减少处理括号时边界条件的处理难度

class Solution {
public:
    unordered_map<char, int> oper_prio{
    {'+', 1},
    {'-', 1},
    {'*', 2},
    {'/', 2},
    {'%', 2},
    {'^', 3}
    };

    int func(string &s, int &idx) {
        stack<int> nums;
        stack<char> opers;
        if (s[idx] == '+') {
            nums.push(0);
            opers.push('+');
            ++idx;
        } else if (s[idx] == '-') {
            nums.push(0);
            opers.push('-');
            ++idx;
        }

        int num = 0;
        while(idx < s.length()) {
            // 1. 读取数字
            if (isdigit(s[idx])) {
                while (isdigit(s[idx])) {
                    num = num * 10 + s[idx] - '0';
                    ++idx;
                }
                nums.push(num);
                num = 0;    
                --idx;      // 恢复指针
            }
            // 2.读取到'('
            else if (s[idx] == '(') nums.push(func(s, ++idx));
            // 3.读取到')'
            else if (s[idx] == ')') break;
            // 4. 读取到 Other operators
            else {
                while (!opers.empty() && oper_prio[opers.top()] >= oper_prio[s[idx]]) {
                    calc(nums, opers);
                }
                opers.push(s[idx]);
            }

            ++idx;
        }
        
        while (!opers.empty()) {
            calc(nums, opers);
        }

        return nums.top();
    }

    static void calc(stack<int> &nums, stack<char> &opers) {
        long long num2 = nums.top(); nums.pop();
        long long num1 = nums.top(); nums.pop();
        char oper = opers.top(); opers.pop();
        long long res;

        switch(oper) {
            case '+' : res = num1 + num2; break;
            case '-' : res = num1 - num2; break;
            case '*' : res = num1 * num2; break;
            case '/' : res = num1 / num2; break;
            case '%' : res = num1 % num2; break;
            case '^' : res = pow(num1, num2); break;
        }
        
        nums.push(res);
    }

    int solve(string s) {
        // write code here
        int i = 0;
        return func(s, i);
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
09-30 12:39
门头沟学院 C++
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 12:19
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务