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(); } };
再加上昨天的括号递归处理,这样就能实现一个简单的完整的字符串式子的计算了。