额,这个题就是一括号匹配,把多余括号去掉! 因为这些括号已经是匹配好的了,所以,当我们遇到一个)时,那么向前查找的第一个( 一定是它的匹配,这样判断是否去掉就OK了! #include<stdio.h> #include<string.h> #define N 260 char str[N],s[N]; int sign[N]; int main() { int i,j,m,len,k; scanf("%d",&m); getchar(); while(m--) { gets(s); len=0; for(i=0;s[i];i++) if(s[i]!=' ')str[len++]=s[i]; for(i=0;i<len;i++) { if(str[i]==')') { for(j=i-1;j>=1;j--) { if(str[j]=='('&&str[j-1]!='-'&&sign[j]==0) { sign[i]=sign[j]=1; break; } else if(str[j]=='('&&str[j-1]=='-'&&sign[j]==0) { for(k=j+1;k<i;k++) if(str[k]=='+'||str[k]=='-')break; if(k==i) { sign[i]=sign[j]=1; break; } else { sign[i]=sign[j]=2; break; } } else if(sign[j]==0&&sign[i]==0&&str[j]=='(') { sign[j]=sign[i]=2; break; } } if(j==0) { if(str[0]=='('&&sign[0]==0) sign[0]=sign[i]=1; } } } for(i=0;i<len;i++) if(sign[i]!=1)printf("%c",str[i]); puts(""); for(i=0;i<len;i++) sign[i]=0; } }