表达式求值

给一个用字符串表示的表达式数组,求出这个表达式的值。

注意事项

表达式只包含整数, +, -, *, /, (, ).

样例

对于表达式 (2*6-(23+7)/(1+2)), 对应的数组为:

[
  "2", "*", "6", "-", "(",
  "23", "+", "7", ")", "/",
  "(", "1", "+", "2", ")"
],

其值为 2

class Solution {
public:
    /*
     * @param expression: a list of strings
     * @return: an integer
     */
    int evaluateExpression(vector<string> &expression) {
        // write your code here
        if (expression.size() == 0) {
            return 0;
        }
        
        stack<char> operators;
        stack<int> nums;
        for (int i = 0; i < expression.size(); i++) {
            if (expression[i][0] >= '0' && expression[i][0] <= '9') {
                int num = 0;
                for (int j = 0; j < expression[i].size(); j++) {
                    num = num*10 + expression[i][j] - '0';
                }
                nums.push(num);
            } else {
                char op = expression[i][0];
                if (operators.empty()) {
                    operators.push(op);
                } else if (op == '(') {
                    operators.push(op);
                } else if (op == ')') {
                    while (operators.top() != '(') {
                        popAndExe(operators, nums);
                    }
                    operators.pop();
                } else if (op == '+' || op == '-') {
                    char last_op = operators.top();
                    while (last_op == '+' || last_op == '-' || last_op == '*' || last_op == '/') {
                        popAndExe(operators, nums);
                        last_op = operators.empty() ? ' ' : operators.top();
                    }
                    operators.push(op);
                } else if (op == '*' || op == '/') {
                    char last_op = operators.top();
                    while (last_op == '*' || last_op == '/') {
                        popAndExe(operators, nums);
                        last_op = operators.empty() ? ' ' : operators.top();
                    }
                    operators.push(op);
                }
            }
        }
        while (!operators.empty()) {
            popAndExe(operators, nums);
        }
        return nums.top();
    }
    void popAndExe(stack<char>& operators, stack<int>& nums) {
        int num2 = nums.top();
        nums.pop();
        int num1 = nums.top();
        nums.pop();
        char op = operators.top();
        operators.pop();
        nums.push(exe(num1, num2, op));
    }
    int exe(int num1, int num2, char op) {
        int result = 0;
        if (op == '+') {
            result = num1 + num2;
        } else if (op == '-') {
            result = num1 - num2;
        } else if (op == '*') {
            result = num1 * num2;
        } else if (op == '/') {
            result = num1 / num2;
        }
        return result;
    }
};






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值