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

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

3.1 规则

  • 1、初始化栈和集合:运算符号栈s1和存储空间集合s2

  • 2、从左到右扫描中缀表达式

  • 3、遇到操作数时,将其加入s2

  • 4、遇到运算符时,比较其与s1栈顶运算符的优先级

  • 4.1、如果s1为空,或栈顶运算符为左括号‘(’,则直接将此运算符入栈

  • 4.2、否则,若优先级比栈顶运算符的高,也将运算符压入s1

  • 4.3、否则,将s1栈顶的运算符弹出并加入到s2中,再次转到 流程4

  • 5、遇到括号时:

  • 5.1、如果是左括号‘(’,则直接压入s1

  • 5.2、如果是右括号‘)’,则依次弹出s1栈顶的运算符,并且加入s2,直到遇到左括号为止,此时将这一对括号丢弃

  • 6、重复步骤 2-5,直到表达式的最右边

  • 7、将s1中剩余的运算符依次弹出并加入s2

  • 8、s2结果即为中缀表达式对应的后缀表达式

3.2 实例

以上面的转换为实例,比如输入 1 + ( ( 2 + 3 ) * 4 ) - 5,那么怎么转换成后缀表达式呢?

扫描到的元素 s2集合中元素 s1(栈底->栈顶) 说明
1 1 数字 直接加入到集合中
+ 1 + s1为空,直接入栈
( 1 +( 左括号 直接入栈
( 1 +( ( 同上
2 12 +( ( 数字
+ 12 +( (+ s1栈顶是左括号,运算符直接入栈
3 123 +( (+ 数字
) 123+ +( 右括号,弹出运算符直至遇到左括号
* 123+ +( * s1栈顶是左括号,运算符直接入栈
4 123+4 +( * 数字
) 123+4 * + 右括号,弹出运算符直至遇到左括号
- 123+4 *+ - -与+优先级相同,因此弹出+号,在压入-
5 123+4 *+ 5 - 数字
到达最右端 123+4 *+ 5 - s1中剩余的运算符

至此整个过程转换完毕

即中缀表达式1 + ( ( 2 + 3 ) * 4 ) - 5 的后缀表达式为1 2 3 + 4 * + 5 -

非原创原文链接:https://blog.csdn.net/qq_36144258/article/details/95075064

0%