【描述问题】
给出一个字符串: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;
}
}