class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
// string-》int,读取s中连续的数字
int str2Int(string s, int &index) {
string tmpstr;
while(s[index] <= '9' && s[index] >= '0') {
tmpstr += s[index++];
}
return stoi(tmpstr);
}
// 计算
void calc(stack<int> &val, stack<char> &ops) {
int val1 = val.top();
val.pop();
int val2 = val.top();
val.pop();
char c = ops.top();
ops.pop();
switch (c) {
case '+' : val.push(val1 + val2); break;
case '-' : val.push(val2 - val1); break;
case '*' : val.push(val1 * val2); break;
default: break;
}
}
int solve(string s) {
stack<int> val;
stack<char> ops;
for (int i = 0; i <= s.length(); ) {
if (s[i] >= '0' && s[i] <= '9') {
val.push(str2Int(s, i)); // 将数字存入stack val中
} else if (ops.empty() || ops.top() == '(' || s[i] == '(') {
ops.push(s[i++]); // 将操作符存入stack ops中
} else if (s[i] == '*') { // 遇到*,及时相乘
int val1 = val.top(), val2 = str2Int(s, ++i);
val.pop();
val.push(val1 * val2);
} else { // 剩下的都是加减乘数
calc(val, ops); // 计算
if (s[i] == ')') {
ops.pop();
i++;
} else if (i == s.length()){
break;
}
}
}
return val.top();
}
};