题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格
。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2" 输出: 7
示例 2:
输入: " 3/2 " 输出: 1
示例 3:
输入: " 3+5 / 2 " 输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数
eval
。
问题分析
此题还是用栈来解决。核心思想是将字符串拆分成一个个正数或负数,其中如果遇到乘法算式或者除法算式,那么将其算出结果后,将结果作为一个正数或负数放到原位置。最后把这些正数或负数都加起来,就得到结果了。遍历字符串,当遇到的字符是数字时,就用while循环把这个数整个找出来。如果遍历到的字符是加减乘除,或者此字符是字符串中的尾字符,那么如果是加减乘除则将该字符前面的数进行处理,或在当前字符是尾字符时把当前的数进行处理,并在处理后入栈。如果待被处理的数是一个单独的正数或者负数,即此时的sign为‘+’或者‘-’,那么将其压入栈;如果待被处理的数不是单独的数,即此时的sign为'*'或'/',那么我们需要将该乘式或除式算出来再压入栈。具体方法为把当前栈顶的数弹出,然后与当前待被处理的数num做乘除法,然后将结果压入栈。待被处理的数处理结束后,我们要将sign置为当前遍历到的符号c,然后将num置为0。如此进行当遍历完字符串后,字符串中的分结果都已经存入栈中了,所以我们把栈中的数都加起来得到ans然后返回即可。
代码实现
class Solution {
public:
int calculate(string s) {
int n = s.size();
int ans = 0;
int num = 0;
stack<int> st;
char sign = '+';
for(int i = 0; i < n; i++){
char c = s[i];
if(c >= '0' && c <= '9'){
while(i < n && s[i] >= '0' && s[i] <= '9'){
num = num * 10 + (s[i] - '0');
i++;
}
i--;
}
if(c == '+' || c == '-' || c == '*' || c == '/' || i == n - 1){
if(sign == '+')
st.push(num);
if(sign == '-')
st.push(-num);
if(sign == '*' || sign == '/'){
int temp = (sign == '*'? st.top() * num : st.top() / num);
st.pop();
st.push(temp);
}
sign = c;
num = 0;
}
}
while(!st.empty()){
ans += st.top();
st.pop();
}
return ans;
}
};