关于表达式去掉多余的括号
括号在三种情况下可以去掉:
1:开头的括号,不管怎样都可以去掉
2:括号前面不是'-'号的括号,可以去掉
3:括号前面是'-'号,但是里面没有运算符的也可以去掉
// 1690.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define N 260 int main() { int t,i,j,del[N],mark[N],used[N]; char s[N],str[N]; scanf("%d",&t); getchar(); while(t--) { gets(s); for(j=0,i=0;s[i];i++) if(s[i]!=' ')str[j++]=s[i]; //去掉空格 str[j]=0; memset(used,0,sizeof(used)); memset(mark,-1,sizeof(mark));//保存右括号的匹配左括号的下标 for(i=0;str[i];i++) { if(str[i]==')' && mark[i]==-1) { for(j=i-1;j>=0;j--) if(str[j]=='(' && used[j]==0) { used[j]=1,mark[i]=j;break; } } } memset(del,0,sizeof(del)); for(i=0;str[i];i++) { if(!del[i] && str[i]==')') { int flag=0; //无运算符 for(j=i-1;j>mark[i];j--) if(str[j]=='+' || str[j]=='-') { flag=1;break; //有运算符,即对'-'敏感 } if(mark[i]==0 || str[mark[i]-1]!='-' || (str[mark[i]-1]=='-'&&!flag) ) del[i]=1,del[mark[i]]=1; } } for(i=0;str[i];i++) if(!del[i])printf("%c",str[i]); puts(""); } return 0; }