这一题主要是需要考虑的情况考虑到了即可,我们需要去掉对这个式子无用的括号。
把每对括号,满足以下任意一个条件的就可以去掉:
1,最外面的括号
2,前面不是 减号 的括号
3,前面是减号,但左右括号之间仅有变量,而没有 加减号 的括号。
我利用栈和数组存储了右括号对应左括号的下标,大家也可以试试其他方法。
这里给一个测试数据。
5
(A-B + C) - (A+(B - C)) - (C-(D- E) )+(A-B + C) - (A+(B - C)) - (C-(D- E) )+(A-B + C) - (A+(B - C)) - (C-(D- E) )+(A-B + C) - (A+(B - C)) - (C-(D- E) )+(A-B + C) - (A+(B - C)) - (C-(D- E) )+(A-B + C) - (A+(B - C)) - (C-(D- E) )+A+A+A+A+A+A+A+A+A+A+A+A+A+A
((A)-( (B)))
A-(B+C)
- (A - C)
-((A)+C)
输出为:
A-B+C-(A+B-C)-(C-(D-E))+A-B+C-(A+B-C)-(C-(D-E))+A-B+C-(A+B-C)-(C-(D-E))+A-B+C-(A+B-C)-(C-(D-E))+A-B+C-(A+B-C)-(C-(D-E))+A-B+C-(A+B-C)-(C-(D-E))+A+A+A+A+A+A+A+A+A+A+A+A+A+A
A-B
A-(B+C)
-(A-C)
-(A+C)
#include <stack>
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define MAX 256
int n;
int main(){
char in[MAX] ,temp[MAX];
int flag[MAX],mask[MAX];
int i,j,count,icount;
stack<int> out;
scanf("%d",&n);
getchar();
while(n--){
memset(flag,0,sizeof(flag));
memset(mask,-1,sizeof(mask));
cin.getline(in,MAX);
for(i=0;i<strlen(in);i++){
if(in[i] == '(') {
flag[i]=1;
out.push(i);
}
else if(in[i] == ')'){
flag[i] = 2;
mask[i] = out.top();
out.pop();
}
else if(in[i] == ' ') flag[i] = 3;
}
count = 0;icount=0;
for(i=0;i<strlen(in);i++){
if(flag[i] == 1 ){
j=i-1;
while(flag[j]==3)j--;
if(in[j] == '-'){
out.push(i);
temp[icount++] = in[i];
count++;
}
}
else if(flag[i]==2 && count!=0 && mask[i] == out.top()){
temp[icount++] = in[i];
count--;
out.pop();
}
else if(flag[i]==0)temp[icount++] = in[i];
}
for(i=0;i<icount;i++){
if(temp[i] == '(' && temp[i+2]==')'){
cout<<temp[i+1];i+=2;
continue;
}
cout<<temp[i];
}
cout<<endl;
}
}