1690 (Your)((Term)((Project)))

問題概要

  1. ,-,(),および一文字の変数からなる式が与えられる。

この式の括弧をできるだけ外し、空白を取り除いた式を出力せよ。
ただし-二回が+になるような変形は行ってはならない。

解法

構文解析する。

  1. (式)を見つけたら括弧を外して+式にする。

マイナスの次の括弧は、単項からなる場合以外は外せない。

ソースコード

int m; string in;
char in2[300];
string func(int s,int t)
{
	int i=t-1,d=0;
	for(;i>s;i--)
	{
		if(in[i]==')')d++;
		if(in[i]=='(')d--;
		if(d==0&&(in[i]=='-'||in[i]=='+'))break;
	}
	if(i>s)
	{
		string a=func(s,i),b=func(i+1,t);
		if(in[i]=='+')return a+"+"+b;
		d=0; bool op=0;
		rep(j,b.size())
		{
			if(b[j]=='(')d++;
			if(b[j]==')')d--;
			if(d==0&&(b[j]=='-'||b[j]=='+'))op=1;
		}
		if(op)return a+"-("+b+")";
		return a+"-"+b;
	}
	if(in[s]=='(')return func(s+1,t-1);
	return in.substr(s,1);
}
int main()
{
	scanf("%d ",&m);
	rep(i,m)
	{
		gets(in2);
		in.clear();
		for(int i=0;in2[i];i++)if(in2[i]!=' ')in.pb(in2[i]);
		
		cout<<func(0,in.size())<<endl;
	}
	return 0;
}