嵌套类问题解题模板(模拟计算器)
用到数字栈和符号栈
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int where;
// 提前声明
int f(const string& s, int i);
void push(vector<int>& numbers,
vector<char>& ops,
int cur,
char op) {
int n = numbers.size();
// 前一个运算符是加减,当前数字直接加入
if (n == 0 || ops[n - 1] == '+' || ops[n - 1] == '-') {
numbers.push_back(cur);
ops.push_back(op);
} else {
// 前一个运算符是乘除,立即计算
int topNumber = numbers[n - 1];
char topOp = ops[n - 1];
if (topOp == '*') {
numbers[n - 1] = topNumber * cur;
} else {
numbers[n - 1] = topNumber / cur;
}
ops[n - 1] = op;
}
}
int compute(const vector<int>& numbers,
const vector<char>& ops) {
int n = numbers.size();
int ans = numbers[0];
for (int i = 1; i < n; ++i) {
if (ops[i - 1] == '+') {
ans += numbers[i];
} else {
ans -= numbers[i];
}
}
return ans;
}
// 从 s[i] 开始计算
// 遇到字符串结尾或者右括号停止
int f(const string& s, int i) {
int cur = 0;
vector<int> numbers;
vector<char> ops;
while (i < s.size() && s[i] != ')') {
// 读取多位数
if (s[i] >= '0' && s[i] <= '9') {
cur = cur * 10 + (s[i] - '0');
++i;
}
// 遇到运算符
else if (s[i] != '(') {
push(numbers, ops, cur, s[i]);
cur = 0;
++i;
}
// 遇到左括号
else {
cur = f(s, i + 1);
// where 指向右括号
i = where + 1;
}
}
// 把最后一个数字加入
push(numbers, ops, cur, '+');
// 记录当前停止的位置
where = i;
return compute(numbers, ops);
}
int calculate(const string& str) {
where = 0;
return f(str, 0);
}
int main() {
string str;
cin >> str;
cout << calculate(str) << '\n';
return 0;
}