样例过但是RE+RE+WA+WA+WA 0pts求救
查看原帖
样例过但是RE+RE+WA+WA+WA 0pts求救
730717
wanwang楼主2024/7/27 09:57

rt

code:

#include<bits/stdc++.h>
#define lot long long
using namespace std;
inline int read(){
	int XX=0,FF=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			FF*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		XX=XX*10+ch-48;
		ch=getchar();
	}
	return XX*FF;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
string s,t;
int lent;
int right(char c){
	if(c=='+'||c=='-')return 1;
	else if(c=='*'||c=='/')return 2;
	else if(c=='^')return 3;
	else return 0;
}
void trans(string s){
	s='('+s+')';
	stack<char>q;
	for(int i=0;i<s.length();i++){
		if(s[i]=='(')q.push(s[i]);
		else if(s[i]>='0'&&s[i]<='9'){
			while(s[i]>='0'&&s[i]<='9')t=t+s[i++];
			i--;
			t+=" ";
		}
		else if(s[i]==')'){
			while(!q.empty()&&q.top()!='('){
				t=t+q.top()+" ";
				q.pop();
			}
			q.pop();
		}
		else if(s[i]=='^'){
			if(q.top()=='('||right(q.top())<right(s[i]))q.push(s[i]);
			else while(q.top()!='('&&right(q.top())<=right(s[i])){
				t=t+q.top()+" ";
				q.pop();
			}
		}
		else if(s[i]=='*'||s[i]=='/'||((s[i]=='+'||s[i]=='-')&&((s[i-1]>='0'&&s[i-1]<='9')||s[i-1]==')'))){
			if(q.top()=='('||right(q.top())<right(s[i]))q.push(s[i]);
			else while(q.top()!='('&&right(q.top())<right(s[i])){
				t=t+q.top()+" ";
				q.pop();
			}
		}
		else t=t+s[i];
	}
	while(!q.empty())t=t+q.top(),q.pop();
	return ;
}
lot qpow(lot a,lot b){
	lot ans=1;
	while(b>0){
		if(b&1)ans=ans*a;
		b>>=1;
		a*=a;
	}
	return ans;
}
int main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	cin>>s;
	trans(s);
	cout<<t;puts("");
	stack<int>q;
	for(int i=0;i<t.length();i++){
		if(((t[i]=='-'||t[i]=='+')&&t[i+1]>='0'&&t[i+1]<='9')||(t[i]>='0'&&t[i]<='9')){
			bool f=(t[i]=='-'?1:0);
			if(t[i]=='-'||t[i]=='+')i++;
			int num=t[i++]-'0';
			while(t[i]>='0'&&t[i]<='9')num=num*10+t[i]-'0',i++;
			i--;
			q.push((f?-num:num));
//			cout<<num<<' ';
		}
		else if(t[i]!=' '){
			int num1,num2;
			num2=q.top();
			q.pop();
			num1=q.top();
			q.pop();
//			cout<<num1<<' '<<num2<<"\n";
			switch(t[i]){
				case'+':q.push(num1+num2);break;
				case'-':q.push(num1-num2);break;
				case'*':q.push(num1*num2);break;
				case'/':q.push(num1/num2);break;
				case'^':q.push(qpow(num1,num2));break;
			}
		}
	}
	write(q.top());
	return 0;
}
2024/7/27 09:57
加载中...