P1981表达式RE求助(代码有详细注释)
  • 板块灌水区
  • 楼主Flying_hp
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/4 18:05
  • 上次更新2024/10/4 20:13:04
查看原帖
P1981表达式RE求助(代码有详细注释)
1123665
Flying_hp楼主2024/10/4 18:05

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;
}

2024/10/4 18:05
加载中...