Unaccepted 100
查看原帖
Unaccepted 100
773659
Elysia11115480楼主2023/12/29 15:54

rt.

求调

#include<bits/stdc++.h>

using namespace std;

struct node{
	bool isc;
	int data;
};
int Pow(int i,int j)
{
	int ret=1;
	for(int k=1;k<=j;k++) ret*=i;
	return ret;
}
int F(char c)
{
	if(c=='+'||c=='-') return 1;
	if(c=='(') return 0;
	if(c=='/'||c=='*') return 2;
	if(c=='^') return 3;
	printf("1145141919810\n");
	printf("%c\n",c);
	return -114514;
}
int R(char c)
{
	return c=='+'||c=='-'||c=='*'||c=='/'||c=='^';
} 
void Print(node *a,int i)
{
	if(a[i].isc)
		printf("%c ",a[i].data);
	else
		printf("%d ",a[i].data);
}//输出 
bool flag;
int len,pos,pos2;
char c[105];
node a[1005];
node b[1005];
stack<char> sta;
int main()
{
	scanf("%s",c);
	len=strlen(c);
	for(int i=0;i<len;i++)
	{
		if(c[i]>='0'&&c[i]<='9'){
			a[++pos].data=c[i]-'0';
			a[pos].isc=0;
		}
		else
		{
			if(c[i]=='(') sta.push(c[i]);
			else if(c[i]==')'){
				while(sta.top()!='('){
					a[++pos].data=sta.top();
					a[pos].isc=1;
					sta.pop();
				}
				sta.pop();
			}
			else{
				while(sta.size()&&F(sta.top())>=F(c[i]))
				{
					a[++pos].data=sta.top();
					a[pos].isc=1;
					sta.pop();
				}
				sta.push(c[i]);
			}
		}
	}
	while(sta.size())
	{
		a[++pos].data=sta.top();
		a[pos].isc=1;
		sta.pop();
	}//以上为中缀转后缀 
	for(int i=1;i<=pos;i++)
		Print(a,i);
	printf("\n");
	while(1)
	{
		int j;
		flag=false;
		for(j=1;j<=pos;j++)
		{
			if(a[j].isc)
			{
				flag=true;
				//printf("这次操作修改了第%d个符号\n",j);
				pos2-=2;
				switch(a[j].data)
				{
					case '+':
						b[++pos2].data=a[j-1].data+a[j-2].data;
						break;
					case '-':
						b[++pos2].data=a[j-2].data-a[j-1].data;
						break;
					case '*':
						b[++pos2].data=a[j-2].data*a[j-1].data;
						break;
					case '/':
						b[++pos2].data=a[j-2].data/a[j-1].data;
						break;
					case '^':
						b[++pos2].data=Pow(a[j-2].data,a[j-1].data);
						break;
				}
				b[pos2].isc=0;
				break;
			}
			else{
				b[++pos2].data=a[j].data;b[pos2].isc=0;
			}
		}
		if(!flag) break;
		j++;
		for(;j<=pos;j++){
			b[++pos2].data=a[j].data;
			b[pos2].isc=a[j].isc;
		}//在操作一个符号之后,将这个符号略过并把后面的字符复制过来 
		for(j=1;j<=pos2;j++){
			a[j].data=b[j].data;
			a[j].isc=b[j].isc;
			Print(a,j);
		}//数据转移 
		printf("\n");
		pos=pos2;
		pos2=0;
	}
	return 0;
}
2023/12/29 15:54
加载中...