1.题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
2.思路
这道题因为没有括号所以相对来说简单很多,只要注意* / 这2个运算符优先级大于+ -即可。我们知道要让优先级高的先运算,那么就要把优先级低的加减运算先保存起来,所以用栈来保存+和-运算后的数字,对于乘除运算后面的数字我们直接将栈顶的元素与当前的元素计算即可。
Tips:
此处用了一个vector来模拟栈,只需要判断back也就是栈顶的元素即可,我们用preSign来保存数字前面的运算符。初始preSign为’+’,因为我们要把第一个数字给压栈,后面的情况下只要是运算符我们就将前面是加减情况的压栈,乘除的计算后压栈。
注意:最后一个是数字情况下也得判断
3.代码
class Solution {
public:
int calculate(string s) {
int n = s.size();
vector<int> st;
char preSign = '+';
int num = 0;
for (int i = 0; i < n;) {
while (isdigit(s[i])) {
//获取数字
num = num * 10 + (s[i] - '0');
++i;
}
if (s[i] != ' ' || i == n - 1) {
if (preSign == '+') {
//+:数字入栈
st.push_back(num);
} else if (preSign == '-') {
//-:数字入栈
st.push_back(-num);
} else if (preSign == '*') {
//*:对栈顶元素施加乘法
st.back() *= num;
} else {
st.back() /= num; ///:对栈顶元素施加除法
}
preSign = s[i]; //更新最近位置的操作符
num = 0;
}
++i;
}
int ans = accumulate(st.begin(), st.end(), 0); //对所有元素求和
return ans;
}
};