hoj12008 Parenthesis

呵呵 。。。

这道题是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值