【问题】实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。整数除法仅保留整数部分。
输入: "3+2*2" 输出: 7 示例 2: 输入: " 3/2 " 输出: 1
【思路】
总体思路来说,我们遍历字符串的每个字符,注意:加减乘除以及空格的ASCII码 < '0'。如果这个字符为数字字符,需要将两个非数字字符之间的不包含空格的字符串变换成数值!
表达式:num = num * 10 - '0' + s[i];
对于非数字字符来说,有三种情况:
-
'+': 将这个字符后面的数压入堆栈nums中
-
'-': 将这个字符后面的数取反后压入堆栈nums中
-
'*' 或 '/': nums.top()为这个符号前面的数,而num为这个符号后面的数,根据符号计算这两个数的值后,再压入堆栈
这样一来,表达式的结果就是最后堆栈内所有数值的和,有一个问题:表达式的第一个值是怎么获取的呢?因为程序中总是将非数字符号后面的值压入堆栈中,但第一个值的前面有符号么?当然有,因为sign的初始化为'+'.
class Solution { public: int calculate(string s) { int res = 0, num = 0; char sign = '+'; stack<int> nums; for(int i = 0; i < s.size(); i++){ if(s[i] >= '0'){ num = num * 10 - '0' + s[i]; //要先做减法,否则int型会溢出 } if((s[i] < '0' && s[i] != ' ') || i == s.size() -1){ if(sign == '+'){ nums.push(num); } else if(sign == '-'){ nums.push(-num); } else if(sign == '*' || sign == '/'){ int tmp = sign == '*' ? nums.top() * num : nums.top() / num; nums.pop(); nums.push(tmp); } sign = s[i]; num = 0; } } while(!nums.empty()){ res += nums.top(); nums.pop(); } return res; } };