#include <cctype>
#include <functional>
#include <queue>
#include <stack>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
int solve(string s) {
queue<char> q;
for (auto &c: s) {
q.push(c);
}
function<int()> recur = [&]() -> int {
stack<int> st;
char bef = '+';
int num = 0;
while (!q.empty()) {
auto now = q.front();
q.pop();
if (isdigit(now)) {
num = num * 10 + (now - '0');
}
if (now == '(') {
num = recur();
}
if (!isdigit(now) || q.empty()) {
switch (bef) {
case '+': {
st.push(num);
} break;
case '-': {
st.push(-num);
} break;
case '*': {
st.top() *= num;
} break;
}
num = 0;
bef = now;
}
if (now == ')') {
break;
}
}
int res = 0;
while (!st.empty()) {
res += st.top();
st.pop();
}
return res;
};
return recur();
}
};
思路:递归。
* 遇到左括号进入递归。
* 遇到右括号退出递归,返回值即为括号里的表达式值。
* 把加减当作正负数存在栈中,结束时一起运算。
* 乘法优先级高,所以遇到乘法时需要马上取出栈顶的数计算。

京公网安备 11010502036488号