题解 | #表达式求值#

表达式求值

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

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
   unordered_map<char, int> pri = {
        {'-',1},{'+',1},{'*',2}
    };
    int solve(string s) {
        // write code here
        //双栈
        stack<char> ops;
        stack<int> nums;
        nums.push(0);
        int n = s.size();
        for(int i = 0;i < n;i ++) {
            if(isdigit(s[i])) {
                int j = i;
                while(j < n&&isdigit(s[j])) j ++;
                int num = stoi(s.substr(i,j-i));
                nums.push(num);
                i = j - 1;
            } else if (s[i] == '(') {
                ops.push(s[i]);
            } else if (s[i] == ')') {
                while(!ops.empty()&&ops.top()!='(') {
                    calc(nums,ops);
                }
                ops.pop();
            } else {
                //新操作
                while(!ops.empty()&&ops.top() != '(') {
                    if(pri[ops.top()] >= pri[s[i]]) {
                        calc(nums,ops);
                    }else {
                        break;
                    }
                }
                ops.push(s[i]);
            }
        }
        while(!ops.empty()&&ops.top() != '(') calc(nums,ops);
        return nums.top();
        
    }
    
    void calc(stack<int>& nums, stack<char>& ops) {
        char op = ops.top();
        ops.pop();
        int b = nums.top();
        nums.pop();
        int a = nums.top();
        nums.pop();
        int ans = 0;
        switch (op) {
            case '+':
                ans = a +b;
                break;
            case '-':
                ans = a-b;
                break;
            case'*':
                ans = a*b;
                break;
            default:
                break;
                
        }
        nums.push(ans);
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务