注意:( (x+y) )z 这种情况,括号中的+共用!
出数据时注意复用的非常规情况。
(x+( (x+y) ( y ) ( t ) +m ) )z
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
char s[2010];
int p[2010],flag[2010],stack[2010];
//很显然用栈结构来做
int main()
{
while(scanf("%s",s)!=EOF)
{
int top=-1;
memset(p,0,sizeof(p));
memset(flag,0,sizeof(flag));
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]=='(')
stack[++top]=i;
else if(s[i]=='+')
flag[stack[top]]=1;
else if(s[i]==')')
{
bool f=i<len-1&&s[i+1]!='+'&&s[i+1]!=')';
bool g=stack[top]>0&&s[stack[top]-1]!='+'&&s[stack[top]-1]!='(';
//当括号内部有加法,并且外部乘以某数时,括号不能删除
if(!(flag[stack[top]]&&(f||g)))
p[stack[top]]=p[i]=1;
//当两个括号紧邻(())时,括号内部的加号共用
if(i<len-1&&s[i+1]==')'&&stack[top]>0&&s[stack[top]-1]=='(')
flag[stack[top-1]]=flag[stack[top]];
top--;
}
}
for(int i=0;i<len;i++)
if(p[i]==0)
printf("%c",s[i]);
printf("\n");
}
return 0;
}