class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ stack<int>num; stack<char> ops; map<char, int> p; void cal(int a, int b, char op) { if (op == '+') num.push(b + a); if (op == '-') num.push(b - a); if (op == '*') num.push(b * a); } int solve(string s) { // write code here p['+'] = 1; p['-'] = 1; p['*'] = 2; for (int i = 0; i < s.length();) { if (s[i] == '(') { ops.push(s[i]); i++; } else if (isdigit(s[i])) { bool f = 1;//默认正 if (i == 1 && s[i - 1] == '-') f = -1;//负 string t = ""; while (isdigit(s[i])) { t += s[i]; i++; } num.push(f * stoi(t)); } else if (s[i] == '+' || s[i] == '-' || s[i] == '*') { if (ops.empty() || p[ops.top()] < p[s[i]]) { ops.push(s[i]); } else { while (!ops.empty() && ops.top()!='('&& p[ops.top()] >= p[s[i]]) { int op = ops.top(); ops.pop(); int n1 = num.top(); num.pop(); int n2 = num.top(); num.pop(); cal(n1, n2, op); } ops.push(s[i]); } i++; } else if (s[i] == ')') { while (!ops.empty() && ops.top() != '(') { int op = ops.top(); ops.pop(); int n1 = num.top(); num.pop(); int n2 = num.top(); num.pop(); cal(n1, n2, op); } ops.pop(); i++; } } while (!ops.empty()) { int op = ops.top(); ops.pop(); int n1 = num.top(); num.pop(); int n2 = num.top(); num.pop(); cal(n1, n2, op); } return num.top(); } };