Leetcode每日一题 227. 基本计算器 II

昨天的题基础上加了乘法和除法,但去除了括号,其实也很简单,既然知道了怎么利用栈实现基础的"1+1" ,那么乘法或除法只需要将栈中的上一个数a乘上或除以当前这个数b,得到c,然后让a出栈,c入栈就行了,这里可能会被先乘后除再加再减的数学计算规则给误导,如果再加上括号,导致越想越复杂,其实并没有那么难,因为我们维护的是一个保存了每一位数字的栈,遇到乘或除就按上面的方法过一遍,遇到加减直接将上一个数入栈就行,最后把栈内的每一个数加起来,就是我们要的结果。

227. 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例 1:

输入:s = "3+2*2"
输出:7
示例 2:

输入:s = " 3/2 "
输出:1
示例 3:

输入:s = " 3+5 / 2 "
输出:5

代码如下:

class Solution {
public:
    inline bool isdigit(char c)
    {
        return c>='0'&&c<='9';
    }
public:
    string s;
    int i;
    int s_size;
    int dfs()
    {   
        char sign = '+';
        stack<int> num;
        long long sum = 0;
        while(i<s_size)
        {
            char c = s[i++];
            if(isdigit(c))
                sum = sum * 10 + (c - '0');
            if(c == '(')
                sum = dfs();
            if((!isdigit(c)&&c!=' ')||i >= s_size)
            {
                int tmp;
                switch(sign){
                    case '+':num.push(sum);break;
                    case '-':num.push(-sum);break;
                    case '*':tmp = num.top() * sum;num.pop();num.push(tmp);break;
                    case '/':tmp = num.top() / sum;num.pop();num.push(tmp);break;
                }
                sign = c;
                sum = 0;
            }
            if(c == ')')
                break;
        }
        
        int res = 0;
        while(!num.empty())
        {
            res += num.top();
            num.pop();
        }
        return res;
    }
public:
    int calculate(string s) {
        this->s = s;
        this->i = 0;
        this->s_size = s.size();
        return dfs();
    }
};

再加上昨天的括号递归处理,这样就能实现一个简单的完整的字符串式子的计算了。

原文地址:https://www.cnblogs.com/xiangqi/p/14517523.html