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

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

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;
}


相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页