呵呵 。。。
这道题是2011年暑假培训时,跑出去打工回来后做的第一道题,纠结了许久,不过还是做出来了,
这道题目用的枚举的算法。题目式子中运算符只有加、乘、括号,所以括号两端可能出现的运算符的情况只有(3*3)种(不包括括号某一端为空的情况),如果为下面4种情况的话:
(1)a+(b+c)+a
(2) a+((b+c)+d)+a
(3) a+(a+(b+c))+a
(4) a+((b+c))+a
此时可以去掉该括号,其它情况(不包括括号某一端为空的情况)括号内内容都可以看做一个因子,如果括号内全为乘法,则括号亦可去掉。注意下面几种情况。
(1)a+((a+b)c+d)a+a
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int i,j,k;
char exp[1010], e[1010];
int stack[510], flag[1010], top;
while(scanf("%s", exp) != EOF)
{
int length = strlen(exp);
top = -1;
for(i=0; i<length; i++)
{
memset(flag, 0, sizeof(flag));
for(j=0; j<length; j++)
e[j] = exp[j];
e[j] = '\0';
if(e[i] == '(')
{
stack[++top] = i;
}
else if(e[i] == ')')
{
int l, r;
l = stack[top--];
r = i;
if((l == 0 || e[l-1] == '+' || e[l-1] == '(') && (r+1 == length || e[r+1] == '+' || e[r+1] == ')'))
flag[r] = flag[l] = 1;
else
{
bool isPri = true;
int t = -1;
for(j=l+1; j<r; j++)
if(e[j] == '+' && t == -1)
isPri = false;
else if(e[j] == '(')
t++;
else if(e[j] == ')')
t--;
if(isPri == true)
{
flag[r] = flag[l] = 1;
}
}
}
int len = 0;
for(j=0; j<length; j++)
if(flag[j] == 0)
{
exp[len ++] = e[j];
}
else i--;
exp[len] = '\0';
length = len;
}
for(i=0; i<length; i++)
cout<<exp[i];
cout<<endl;
}
return 0;
}