一个去算术式冗余括号的程序
主旨是去除冗余的括号 如:(a+b)+c -> a+b+c
((a-b)*c) -> (a-b)*c
源程序如下
#include<iostream>
#include<string>
using namespace std;
string str;
bool panB(int beg,int end, bool *a)
{
if(beg==0)return 1;
int i;
for(i=beg-1;i>=0;--i)if(str[i]!=' ')break;
if(i<0)return 1;
if(str[i] == '('|| str[i]== '+' ) return 1;
if(str[i] == '/')return 0;
if(a[0]||a[1])return 0;
else return 1;
}
bool panE(int beg,int end,bool *a)
{
if(end==str.size()-1)return 1;
int i;
for(i=end+1;i<str.size();++i)if(str[i]!=' ')break;
if(i>=str.size())return 1;
if(str[i]=='+'||str[i]=='-')return 1;
if(a[0]||a[1])return 0;
else return 1;
}
int main(int argc, char* argv[])
{
int n, i, j, flag1, flag2;
cin>>n;
while(n--)
{
cin>>str;
int count = 0;
for(i=0;i<str.size();++i)
{
bool fhao[2] = {0};
if(str[i]=='(')
{
flag1 = i;
count ++;
for(j=i+1;j<str.size();++j)
{
if(str[j]=='(')
count++;
if(str[j]==')')
{
count --;
if(!count)
{
flag2 = j;
break;
}
}
if(count==1)
{
if(str[j]=='+') fhao[0] = 1;
if(str[j]=='-') fhao[1] = 1;
}
}
}
else continue;
if(panB(flag1,flag2,fhao) && panE(flag1,flag2,fhao))
{
str[flag1] = ' ';
str[flag2] = ' ';
}
}
for(i=0;i<str.size();++i)
{
if(str[i]==' ')continue;
cout<<str[i];
}
cout<<endl;
}
return 0;
}
为什么 (a+b)/(c)/(e*f) 过不去?