RT,40分RE
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
vector<ll>ans;//储存后缀表达式
stack<char>op;//记录符号的栈
stack<ll>num;//用于接下来的运算
map<char,ll>mp;//记录每一种运算的优先级
ll sum;
ll to_int(char s){//将运算转换为整数
if(s=='+')return -1;
if(s=='-')return -2;
if(s=='*')return -3;
if(s=='/')return -4;
if(s=='^')return -5;
}
void cal(vector<ll>s){//运算后缀表达式
for(ll i=0;i<s.size();i++){
if(s[i]>=0){
num.push(s[i]);
}
else{
ll k=num.top();
num.pop();
ll p=num.top();
num.pop();
if(s[i]==-1)num.push(p+k);
if(s[i]==-2)num.push(p-k);
if(s[i]==-3)num.push(p*k);
if(s[i]==-4)num.push(p/k);
if(s[i]==-5)num.push(pow(p,k));
}
}
cout<<num.top();
}
signed main(){
cin>>s;
mp['-']=mp['+']=1;//记录优先级
mp['*']=mp['/']=2;
mp['^']=3;
for(ll i=0;i<s.size();i++){
if(s[i]>='0'&&s[i]<='9'){
sum=sum*10+(s[i]-'0');
if(s[i+1]<'0'||s[i+1]>'9')ans.push_back(sum),sum=0;//压入数值
}
else{
if(s[i]=='('){//遇到左括号直接压
op.push(s[i]);
continue;
}
if(s[i]==')'){
while(op.size()&&op.top()!='('){//如果遇到有括号,就把与其排队的括号到此括号都压入
ans.push_back(to_int(op.top()));
op.pop();
}
op.pop();
continue;
}
if(op.size()==0){//直接压入
op.push(s[i]);
continue;
}
if(mp[s[i]]>mp[op.top()]){//直接压入
op.push(s[i]);
continue;
}
if(op.top()=='('){//直接压入
op.push(s[i]);
continue;
}
if(s[i]!='^'){
while(op.size()&&op.top()!='('&&mp[op.top()]>=mp[s[i]]){//把优先级>=现在的压入ans
ans.push_back(to_int(op.top()));
op.pop();
}
}
else{
while(op.size()&&op.top()!='('&&mp[op.top()]>mp[s[i]]){//对于乘方的特殊处理
ans.push_back(to_int(op.top()));
op.pop();
}
}
if(op.size()&&op.top()=='(')
op.pop();
op.push(s[i]);
}
}
while(op.size())ans.push_back(to_int(op.top())),op.pop();//如果还有剩余的
// for(ll i=0;i<ans.size();i++)cout<<ans[i]<<" ";
// cout<<endl;
cal(ans);
return 0;
}