注意:( (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;
}