给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
一个数字栈一个符号栈是很经典的解法,遍历字符串。
遇到数字就要加入栈里
遇到字符先看字符栈中有无符号,
无符号比较优先级
若有,判断当前字符优先级是否高于栈顶优先级,高于则入栈。
否则,弹出数字栈两元素,字符栈一个元素,计算。将结果加入到数字栈。
注意优先级相等的情况下也要计算。
class Solution {
public:
stack<char> sc;
stack<int> sn;
void cala(){
int a = sn.top();sn.pop();
int b = sn.top();sn.pop();
char c = sc.top(); sc.pop();
int ans = 0;
if(c == '-') ans = b - a;
if(c == '+') ans = a + b;
if(c == '*') ans = a * b;
if(c == '/') ans = b / a;
sn.push(ans);
}
int calculate(string s){
s = "0" + s;
int num = 0;
map<char, int> m;
m['+'] = m['-'] = 1;
m['*'] = m['/'] = 2;
for (int i = 0; i < s.length(); i++){
if(s[i] == ' ') continue;
if(isdigit(s[i])){
num = num * 10 + (s[i] - '0');
}else{
if(sc.empty()){
sc.push(s[i]);
sn.push(num);
num = 0;
continue;
}
sn.push(num);
while(!sc.empty() && m[sc.top()] >= m[s[i]]) cala();
sc.push(s[i]);
num = 0;
}
}
sn.push(num);
while(!sc.empty()) cala();
return sn.top();
}
};