题目
难度:中等
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数 eval。
解题思路
首先理清楚思路,对字符串进行遍历,通过两个双向队列分别存储数值和运算符,最关键的一步是对*和/遍历到时直接对数值进行计算,而+和-是遍历完成后,做从前向后的依次运算即可。
步骤:
- 创建两个双向队列分别存储遍历到的数值和运算符
- 遇到空格跳过
- 遇到数值,首先要判断该数值是几位数并取到它最终位数的数值,然后判断dq2队列中的最后一个符号是否为*或/,如果是则对dq1中的最后一个数值和当前遍历到的数值进行运算后,推入队列dq1中。同时移除队列dq2中的运算符
- 遍历结束后对dq2的运算符进行遍历得出最后结果
代码
class Solution {
public:
int calculate(string s) {
deque<int> dq1;
deque<char> dq2;
for(int i = 0; i < s.size(); i++){
if(s[i] == ' ') continue;
if(isdigit(s[i])){
int m = s[i] - '0';
while(i < s.size() && isdigit(s[++i])){
m = m * 10 + (s[i] - '0');
}
i--;
if(dq2.size() && (dq2.back() == '*' || dq2.back() == '/')){
int k = dq1.back();
dq1.pop_back();
dq2.back() == '*' ? dq1.push_back(k * m) : dq1.push_back(k / m);
dq2.pop_back();
}else{
dq1.push_back(m);
}
}else dq2.push_back(s[i]);
}
while(dq2.size()){
int a = dq1.front(); dq1.pop_front();
int b = dq1.front(); dq1.pop_front();
dq2.front() == '+' ? dq1.push_front(a + b) : dq1.push_front(a - b);
dq2.pop_front();
}
return dq1.front();
}
};