RT,第一个点RE,自测多余括号可以正常输出
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
ll kf[35],kb[35];
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;
ll cnt=0,cnt2=0;
for(ll i=0;i<s.size();i++){//多余)处理
if(i>0)kf[i]=kf[i-1],kb[i]=kb[i-1];
if(s[i]=='(')cnt++,kf[i]++;
if(s[i]==')')cnt2++,kb[i]++;
}
for(ll i=cnt2+1;i<=cnt;i++)//多余(处理
s+=')';
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]==')'){//遇到),出栈,直到遇到(
if(ans.size()==1){
continue;
}
stack<char>ot;
bool flag=false;
while(op.size()){//遍历
ot.push(op.top());
if(op.top()=='(')flag=true;
op.pop();
}
while(ot.size()){//还原
op.push(ot.top());
ot.pop();
}
if(!flag)continue;//没有配对的(
while(op.size()&&op.top()!='('){//加入
ans.push_back(to_int(op.top()));
op.pop();
}
if(op.size())
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.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()){//如果还剩余
if(op.top()!=')'&&op.top()!='(')
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;
}