【捞】90pts,WA #9
查看原帖
【捞】90pts,WA #9
507348
__vector__楼主2022/11/12 11:08

对拍找不出错。
而且是后缀表达式处理部分出错了,前面转换部分没错。
4 个关注。

#include <bits/stdc++.h>
typedef long long ll;
using std::cin;
using std::cout;
const int maxn=205;
// zhongzhui -> hou zhui shu zu
char s[maxn];
char sta[maxn];
int statop;
// houzhuishuzu
union Node
{
	ll val;
	char op;
}houzhuistr[maxn],temp[maxn];
int houzhuitop,temptop;
// input
int n;
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=1;i<=n;i++)
	{
		if(s[i]=='-'&&(s[i-1]=='('||i==1))
		{
			houzhuistr[++houzhuitop].val=-(s[i+1]-'0');
			i++;
		}
		else if(isdigit(s[i]))
		{
			houzhuistr[++houzhuitop].val=s[i]-'0';
		}
		else
		{
			if(s[i]=='(')
			{
				sta[++statop]=s[i];
			}
			if(s[i]=='+'||s[i]=='-')
			{
				while(sta[statop]=='-'||sta[statop]=='+'||sta[statop]=='*'||sta[statop]=='/'||sta[statop]=='^')
				{
					houzhuistr[++houzhuitop].op=sta[statop];
					statop--;
				}
				sta[++statop]=s[i];
			}
			if(s[i]=='*'||s[i]=='/')
			{
				while(sta[statop]=='*'||sta[statop]=='/'||sta[statop]=='^')
				{
					houzhuistr[++houzhuitop].op=sta[statop];
					statop--;
				}
				sta[++statop]=s[i];
			}
			if(s[i]=='^')
			{
				sta[++statop]=s[i];
			}
			if(s[i]==')')
			{
				while(sta[statop]!='(')
				{
					houzhuistr[++houzhuitop].op=sta[statop];
					statop--;
				}
				statop--;
			}
		}
	}
	while(statop>=1)
	{
		houzhuistr[++houzhuitop].op=sta[statop];
		statop--;
	}
	statop=0;
	for(int i=1;i<=houzhuitop;i++)
	{
		if(houzhuistr[i].op=='+'||houzhuistr[i].op=='-'||houzhuistr[i].op=='*'||houzhuistr[i].op=='/'||houzhuistr[i].op=='^')
		{
			printf("%c ",houzhuistr[i].op);
		}
		else printf("%lld ",houzhuistr[i].val);
	}
	putchar(10);
	while(houzhuitop>1)
	{
		bool isoped=0;
		for(int i=1;i<=houzhuitop;i++)
		{
			if(houzhuistr[i].op=='+')
			{
				if(!isoped)
				{
					ll num=ll(temp[temptop-1].val)+ll(temp[temptop].val);
					temp[temptop-1].val=num;
					temptop--;
					isoped=1;
				}
				else temp[++temptop].op='+';
			}
			else if(houzhuistr[i].op=='-')
			{
				if(!isoped)
				{
					ll num=ll(temp[temptop-1].val)-ll(temp[temptop].val);
					temp[temptop-1].val=num;
					temptop--;
					isoped=1;
				}
				else temp[++temptop].op='-';
			}
			else if(houzhuistr[i].op=='*')
			{
				if(!isoped)
				{
					ll num=1ll*temp[temptop-1].val*1ll*temp[temptop].val;
					temp[temptop-1].val=num;
					temptop--;
					isoped=1;
				}
				else temp[++temptop].op='*';
			}
			else if(houzhuistr[i].op=='/')
			{
				if(!isoped)
				{
					ll num=ll(temp[temptop-1].val)/ll(temp[temptop].val);
					temp[temptop-1].val=num;
					temptop--;
					isoped=1;
				}
				else temp[++temptop].op='/';
			}
			else if(houzhuistr[i].op=='^')
			{
				if(!isoped)
				{
					ll num=1;
					for(int cnt=1;cnt<=temp[temptop].val;cnt++)
					{
						num=num*1ll*temp[temptop-1].val;
					}
					temp[temptop-1].val=num;
					temptop--;
					isoped=1;
				}
				else temp[++temptop].op='^';
			}
			else
			{
				temp[++temptop].val=houzhuistr[i].val;
			}
		}
		for(int i=1;i<=temptop;i++)
		{
			houzhuistr[i]=temp[i];
			if(temp[i].op=='+'||temp[i].op=='-'||temp[i].op=='*'||temp[i].op=='/'||temp[i].op=='^')
			{
				printf("%c ",temp[i].op);
			}
			else printf("%lld ",temp[i].val);
		}
		houzhuitop=temptop;
		temptop=0;
		putchar(10);
	}
	return 0;
}  
2022/11/12 11:08
加载中...