P10473,80分再求助(代码有注释)
  • 板块灌水区
  • 楼主Flying_hp
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/5 21:34
  • 上次更新2024/10/6 02:25:16
查看原帖
P10473,80分再求助(代码有注释)
1123665
Flying_hp楼主2024/10/5 21:34

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

记录

2024/10/5 21:34
加载中...