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(); } };