您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-23 14:20 429 查看
中缀表达式到后缀表达式的转换

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法