思路:低优先级的加减法操作可以直接入栈,遇到乘除法就用栈顶元素与之计算后将结果入栈,遇到左括号就找这个左括号对应的右括号,将括号内这一段表达式递归计算。
#include <iostream>
#include <stack>
using namespace std;
int calculate(string s)
{
char sign = '+'; //初始符号默认为正
long num = 0; //num表示当前数值
long res = 0; //res表示最终结果
stack<long> stk;
int i = 0;
while (i < s.size())
{
if (s[i] >= '0' && s[i] <= '9') num = num * 10 + s[i] - '0';
else if (s[i] == '(')
{
int cnt = 0;
int j = i;
for (; i < s.size(); i ++ ) //判断这个左括号的范围
{
if (s[i] == '(') cnt ++ ; //括号套娃,则计数加1
if (s[i] == ')') cnt -- ;
if (cnt == 0) break; //计数为0说明括号闭合
}
num = calculate(s.substr(j + 1, i - j - 1)); //递归计算括号内表达式
}
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || i == s.size() - 1)
{
if (sign == '+') stk.push(num);
else if (sign == '-') stk.push(-num);
else if (sign == '*')
{
int tmp = stk.top();
stk.pop();
stk.push(tmp * num);
}
else if (sign == '/')
{
int tmp = stk.top();
stk.pop();
stk.push(tmp / num);
}
sign = s[i]; //更新符号
num = 0; //重置当前数值
}
i ++ ;
}
while (stk.size()) //栈中此时只剩下优先级最低的加法运算(减法变成了加一个负数)
{
res += stk.top();
stk.pop();
}
return res;
}
int main()
{
string s;
cin >> s;
cout << calculate(s) << endl;
}
PS:这道题与力扣上一个会员题一样 772. 基本计算器 III ,不过这题在力扣上是一道困难题😰