中缀表达式 转换为 后缀表达式

来源:互联网 发布:python unittest 回滚 编辑:程序博客网 时间:2024/06/03 22:58

中缀表达式到后缀表达式的转换

1.中缀表达式与后缀表达式的异同:中缀表达式和表达式是由运算符和数字组合起来的表达式,所不同的是,中缀表达式运算符在运算对象中间,而且它的计算是按照优先级和运算符的结合性来计算的。而后缀表达式运算符是在运算对象后面,计算是按照从左到右计算的。

给一个例子 a + b * c + c * d , 后缀表达式会依次算b*c,c*d, a + b * c , a + b * c + c * d。而中缀表达式会先算b*c, a + b * c, c * d, a + b * c + c * d。 不难得出后缀表达式与我们的常用的计算顺序是不同的。因此我们必须来看一下它到底是如何计算的,是否会影响计算结果

2.后缀表达式的计算:从左到右的运算符,若遇到比它优先级高或者等于的预算符的Set,就先算之前的所有set运算符,并且优先级从大到小算,并且去掉已经算过的运算符 。比如a + b * c + c * d,从左到右为+, *, +,因为此时的*, +优先级大于+,所以算+,*,此时未用运算符为+,再次寻找,有*。此时再无运算符,因此将所有的运算符按照优先级大小计算。

3.不难看出,未用的是按照优先级从小到大排列,然而取出是按照从大到小,因此,符合“后进先出”栈的策略

4.因此用栈来保存未运算的符号

5.中缀表达式转后缀表达式的算法请自行百度。其实如果你认真想了上述所言,就知道怎么弄出算法了。切记,后缀表达式和我们平常所采用的计算策略是有差别的

6.下面为代码
bool first( char op ){    return op == '*' || op == '/' || op == '%';}bool noLess( char firstOp, char secOp ){    return first( firstOp ) || !first( secOp );}string transform( string in ){    string post = in;    int indexPost = 0;    stack<char> work;    int cou = 0;    for( int i = 0; i < in.size( ); ++i )    {        if( isalpha( in[ i ] ) )        {            post[ indexPost++ ] = in[ i ];        }        else if( in[ i ] == '(' )        {            ++cou;            work.push( in[ i ] );        }        else if( in[ i ] == ')' )        {            while( work.top( ) != '(' )            {                post[ indexPost++ ] = work.top( );                work.pop( );            }            work.pop( );        }        else        {            while( !work.empty( ) && noLess( work.top( ), in[ i ] ) && work.top( ) != '(' )            {                post[ indexPost++ ] = work.top( );                work.pop( );            }            work.push( in[ i ] );        }    }    while( !work.empty( )  )    {        post[ indexPost++ ] = work.top( );        work.pop( );    }    post.resize( post.size( ) - 2 * cou );    return post;}


原创粉丝点击