中缀表达式 转换为 后缀表达式
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.下面为代码
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; }
相关文章推荐
- 中缀表达式转换为后缀表示和前缀表达式的简单方法
- 栈之中缀表达式转换为后缀表达式
- 栈的应用之中缀表达式转换为后缀表达式
- 4.从中缀向后缀转换表达式
- 中缀到后缀表达式的转换:java-stack实现
- 中缀表达式到后缀表达式的转换C++实现
- 栈应用之将中缀数值表达式转换成后缀表达式
- IT笔试题中经常出现的前缀、中缀、后缀表达式转换问题-----阿冬专栏
- 前缀中缀后缀表达式及其互相转换
- 栈的应用:中缀和后缀表达式的转换及计算
- 中缀、前缀、后缀表达式之间的转换
- 中缀表达式到后缀表达式的转换
- 二叉树中缀表达式到后缀表达式的转换
- 中缀 前缀 后缀表达式 相互转换
- 中缀表达式转换为后缀表达式
- 中缀、前缀、后缀表达式之间的转换
- 栈的应用 平衡符号 后缀表达式 中缀到后缀的转换
- 中缀表达式转换为后缀表达式
- 漫谈栈队列及后缀表达式,后缀中缀表达式间的转换
- 中缀表达式转换为前缀及后缀表达式并求值【摘】