Loading

Leetcode每日一题 224.基本计算器

昨天刚到剑指offer里面看到这道题,今天每日一题刚好就是它...

 

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

示例 1:

输入:s = "1 + 1"
输出:2

 

示例 2:

输入:s = " 2-1 + 2 "
输出:3

 

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

 

以前写过类似的判断括号的问题,想不起来是哪一道了..反正上次是被虐了,不过这次一下就想出来了,我们要思考的第一步是,如何判断最简单的式子,比如"1+1"或者"1+2-3+4-5"类似这种,万能的栈又来了,就不多说了,因为题目里只有加减法,然后加上括号,不过括号还是很好处理的,不用想太复杂,因为括号的最里面绝对是基础式子,回到了简单的"1+1",所以我们只需要用一个递归结构就行了,遇到“(”进入递归,遇到“)”跳出递归,返回一个值,就是括号的和,最后的最后就会变成基础式。

 

class Solution {
public:
    inline bool isdigit(char c)
    {
        return c>='0'&&c<='9';
    }
public:
    string s;
    int i;
    int s_size;
    int dfs(){
        stack<int> num;
        char sign = '+';
        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)
            {
                switch(sign){
                    case '+':num.push(sum);break;
                    case '-':num.push(-sum);break;
                }
                sign = c;
                sum = 0;
            }

            if(c == ')')
                break;
        }
        
        long long res = 0;
        while(!num.empty())
        {
            res+=num.top();
            num.pop();
        }
        return res;
    }
    int calculate(string s) {
        this->i = 0;
        this->s = s;
        this->s_size = s.size();

        return dfs(); 
    }
};

 

posted @ 2021-03-10 20:54  eveilcoo  阅读(63)  评论(0编辑  收藏  举报