求助大佬,80pts,WA#9#10
查看原帖
求助大佬,80pts,WA#9#10
1385606
Yun_Mo_s5_013楼主2024/11/11 21:43
#include<bits/stdc++.h>
using namespace std;
#define int long long

char s1[105],s2[105],s3[105];
char stuck1[105];
int num[105];
char flags[105];
int ans,p=0,cnt=0,cnt2=0,cnt3=0;

int cmp(char m){
	switch(m){
		case '+':
			return 1;
		case '-':
			return 1;
		case '*':
			return 3;
		case '/':
			return 3;
		case '^':
			return 4;
		default:
			return 0;
	}
}

void push(char *l,char n){
	p++;
	l[p]=n;
	return;
}

char pop(char *l){
	return l[p--];
}

bool empty(char *l){
	if(p==0) return 1;
	else return 0;
}

char query(char *l){
	return l[p];
}

void add(char *l,char n){
	l[cnt++]=n;
}

void append(char c){
	if(c>='0'&&c<='9') add(s2,c);
	else{
		if(empty(stuck1)) push(stuck1,c);
		else{
			if(cmp(c)!=0&&cmp(c)>cmp(query(stuck1))){
				push(stuck1,c);
			}else if(c=='^'){
				push(stuck1,c);
			}else if(cmp(c)!=0&&cmp(c)<=cmp(query(stuck1))){
				while(p-1>=0&&cmp(c)<=cmp(query(stuck1))){
					add(s2,pop(stuck1));
				}
				push(stuck1,c);
			}
		}
	}
}

int doit(int a,int b,char c){
	switch(c){
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
		case '/':
			return a/b;
		case '^':
			return (int)(pow(a,b));
	}
}

void out(){
	for(int i=0;i<strlen(s2);i++){
		if(num[i]) printf("%d ",num[i]);
		if(flags[i]) printf("%c ",flags[i]);
	}
}

int search(int k){
	for(int i=k;;i--){
		if(num[i]!=0){
			return i;
		}else if(i<=0) return 0;
	}
}

signed main(){
	cin>>s1;
	for(int i=0;i<strlen(s1);i++){
		if(s1[i]=='('){
			push(stuck1,s1[i]);
			continue;
		}else if(s1[i]==')'){
			int cnt1=cnt;
			cnt=0;
			while(query(stuck1)!='(') add(s3,pop(stuck1));
			pop(stuck1);
			cnt=cnt1;
			for(int j=0;j<strlen(s3);j++) add(s2,s3[j]);
			continue;
		}
		append(s1[i]);
	}
	if(!empty(stuck1)){
		for(int i=p;i>0;i--) add(s2,stuck1[i]);
	}
	for(int i=0;i<strlen(s2);i++){
		printf("%c ",s2[i]);
	}
	cout<<endl;
	for(int i=0;i<strlen(s2);i++){
		if(s2[i]<'0'||s2[i]>'9'){
			cnt3++;
			flags[i]=s2[i];
		}
		else num[i]=(int)(s2[i]-'0');
	}
	int delta=0;
	for(int i=0;i<=strlen(s2);i++){
		if(flags[i]){
			num[i]=doit(num[i-2],num[i-1],flags[i]);
			num[i-2]=0;
			num[i-1]=0;
			flags[i]='\0';
			int pos=search(i-1);
			num[i-1]=num[pos];
			num[pos]=0;
			out();
			delta+=2;
			cout<<endl;
		}
	}
	return 0;
}

2024/11/11 21:43
加载中...