ZOJ 1014 Operand

【描述问题】

给出一个字符串:e.g    (a+b*c)^f+d+e^h

然后把这个字符串逐层分割,按照优先级别   () >    ^     >     *    >    +  分开。

简单的说就是要根据优先级别构造一棵树。

Like 


【思想】

如何实现呢? 恩恩  想了不递归,发现各种情况复杂化了。

于是 递归实现吧?        

Then  分开一步一步来,(1)找出最外层的最低优先级操作符号,如: (a*b)+c  的就是 +    .(2) 然后,  按照话费符号,递归逐层花费下去。

时间: (1) (n)时间    (2)  (n)时间  

由于每一层都有n个元素,也等价于(n)时间

最好是二分,一直分下去,有log(n)层。

So  0(n^2)   平均可以为:(nlogn)

【代码】

给出(1) (2)的代码

/* functiones innitalize*/
char findSpiltChar(char * str,int b,int e)
{
int bracket=0;
char reValue='(';
int index=b;
while(index<=e&&str[index]!='\0')
{
switch(str[index])
{
case '(':
bracket++;
break;
case ')':
bracket--;
break;
case '^':
if(bracket==0&&reValue=='(')
reValue='^';
break;
case '*':
if(bracket==0&&reValue!='+')
reValue='*';
break;
case '+':
if(bracket==0)
reValue='+';
break;
default:
break;
}
index++;
}
return reValue;
}


void spiltString(char * str,int b,int e,int count,int& nb,int& ne)
{
char op=findSpiltChar(str,b,e);


int index,bracket,beg,end;
index=b;
bracket=0;
beg=-1;


while(index<=e&&str[index]!='\0')
{
int divid=0;
switch(str[index])
{
case '(':
if(bracket==0&&beg==-1)
beg=index;
bracket++;
break;
case ')':
bracket--;
if(op=='('&&bracket==0)
divid=1;
break;
case '^':
if(bracket==0&&op=='^')
divid=1;
break;
case '*':
if(bracket==0&&op=='*')
divid=1;
break;
case '+':
if(bracket==0&&op=='+')
divid=1;
break;
default:
if(beg==-1)
beg=index;
break;
}
if(divid)
{
count--;
if(count==0)
{
nb=beg;
ne=index-1;
return ;
}
beg=-1;
}
index++;
}
count--;
if(count==0)
{
nb=beg;
ne=index-1;
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值