讨论 / 改不下去了!求标称&修改
·August· 2012-01-31 06:14:00
点我顶贴 收藏 删除
#include<iostream>

#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;

}

#1 怡红公子@2012-01-31 06:14:00
回复 删除
your's is too long

首先你做这道题时是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;

}

查看更多回复
提交回复