$\huge \color{orange}{成仙之路->}$ $\huge \color{purple}{算法基础课题解}$
思路:
1. 如果是数字就放入 num 中
2. 如果是左括号就直接放入 op 中
3. 如果是右括号就计算括号内的内容,最后把左括号弹出
4. 如果是运算符,就判断前一个运算符的优先级是否大于当前运算符的优先级
5. 如果最后还有运算符,就再计算一遍
完整代码
#include<bits/stdc++.h>
using namespace std;
string str;
stack<int> num; //存储数字
stack<char> op; //存储运算符和左括号
unordered_map<char,int> pr={{'+',1},{'-',1},{'*',2},{'/',2}}; //定义优先级
//计算栈顶的两个元素
void eval()
{
auto b=num.top(); num.pop();
auto a=num.top(); num.pop();
auto t=op.top(); op.pop();
if(t=='+') num.push(a+b);
else if(t=='-') num.push(a-b);
else if(t=='*') num.push(a*b);
else num.push(a/b);
}
int main()
{
cin>>str;
for(int i=0;i<str.size();i++)
{
//取出当前字符
auto t=str[i];
//如果是数字就放入 num 中
if(isdigit(t))
{
int x=0;
while(i<str.size()&&isdigit(str[i])) x=x*10+str[i++]-'0';
num.push(x);
i--;
}
//如果是左括号就直接放入 op 中
else if(t=='(') op.push(t);
//如果是右括号就计算括号内的内容,最后把左括号弹出
else if(t==')')
{
while(op.top()!='(') eval();
op.pop();
}
//如果是运算符,就判断前一个运算符的优先级是否大于当前运算符的优先级
else
{
while(op.size()&&op.top()!='('&&pr[op.top()]>=pr[t]) eval();
op.push(t);
}
}
//如果最后还有运算符,就再计算一遍
while(op.size()) eval();
cout<<num.top()<<endl;
return 0;
}