#include<string>
using namespace std;
int kuo0[1000],g0=0;//正括号位置,几个
int f[500],x1=0,y1=0;//第i个正括号对应反括号的数据地址 ,第几个正括号
int kuo1[1000],g1=0;//反括号位置,几个
int z[500],x2=0,y2=0;//倒数第i个反括号对应正括号的数据地址
string s;
int l;
void qk(int a,int b,int n)//起,止,第几个括号
{
bool bb=true,b1=true;
int i,j;
if(b==l) return;
for(i=a;i<b;i++)
{
if(s[i]=='(')
{
x1++;
if(i==0) bb=false;else if(s[i-1]=='+') bb=false;
if(!bb)
{
if(f[y1]+1==l) bb=true;else if(s[f[y1]+1]=='+') bb=true;
if(bb)
{
qk(i,f[x1]-1,n);i=f[x1];
n++;continue;
}//去括号 a+(b+c)+d a+(bc) a+(b(c+d)) a+(b+ac)
else
{
bb=true,b1=true;
for(j=i;j<s[f[y1]];j++)
{
if(s[j]=='+'&&b1) bb=false;
if(s[j]=='(') b1=false;
}
if(bb) {n++;cout<<s[i];continue;}//不去掉括号 a+(b+c)*c a+(b+ac)*d
else
{
qk(i,f[x1]-1,n);i=f[x1];
n++;continue;
}//去括号 a+(bc)*d a+(b(c+d))*e
}
}
if(i!=0) bb=true;else bb=false;
if(f[y1]+1<l) b1=true;else b1=false;
if(bb&&b1) if(s[i-1]!='+'&&s[f[y1]+1]!='+')
{
bool bb=true,b1=true;
for(j=i;j<s[f[y1]];j++)
{
if(s[j]=='+'&&b1==true) {bb=false;break;}
if(s[j]=='(') b1=false;
}
if(!bb) {n++;cout<<s[i];continue;}//不去掉括号 a(b+(ab+c))*d或a(b+c)*d
else
{
qk(i,f[x1]-1,n);i=f[x1];
n++;continue;
}//去括号 a(bc)*c或a(bc(a+b))*c
}
}
else cout<<s[i];
}
}
int main()
{
int h,i;
int n;
cin>>n;
for(h=0;h<n;h++)
{
cin>>s;
l=s.length();
for(i=0;i<l;i++)kuo0[i]=0;//正括号位置初始化
for(i=0;i<l;i++)kuo1[i]=0;//反括号位置初始化
for(i=0;i<l;i++)
{
if(s[i]=='(')
{
kuo0[g0]=i;g0++;
f[x1]=i;x1++;
}
if(s[i]==')')
{
kuo1[g1]=i;g1++;
z[x2]=f[x1];f[x1]=i;x2++;x1--;
}
}//记录符号
x1=-1;
qk(0,l-1,0);
//去括号输出
}
return 0;
}
首先你做这道题时是23:56:00,缺乏清晰的思路
#include<iostream>
using namespace std;
string s[101];int n;
int main()
{
int i,j,k;
cin>>n;
for(i=0;i<=n;i++)
getline(cin,s[i],'\n');
for(i=1;i<=n;i++)
{
for(j=0;j<s[i].size();j++)
if(s[i][j]=='(')
{
k=j+1;
int ans=1,sum=0;
while(ans!=sum)
{
if(s[i][k]=='(')
ans++;
if(s[i][k]==')')
sum++;
k++;
}
if(s[i][k]!='('&&(s[i][k]>'z'||s[i][k]<'a')&&s[i][j-1]!=')'&&(s[i][j-1]>'z'||s[i][j-1]<'a'))
{s[i][j]='#';s[i][k-1]='#';}
}
for(j=0;j<s[i].size();j++)
if(s[i][j]=='(')
{
k=j+1;
bool p=0;
int ans=1,sum=0;
while(ans!=sum)
{
if(s[i][k]=='+'&&(ans==1||sum==ans-1))
p=1;
if(s[i][k]=='(')
ans++;
if(s[i][k]==')')
sum++;
k++;
}
if(p==0) {s[i][j]='#';s[i][k-1]='#';}
}
for(j=0;j<s[i].size();j++)
if(s[i][j]!='#')
cout<<s[i][j];
cout<<endl;
}
system("pause");
return 0;
}