首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入后缀表达式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:
(1)若取出的字符是数字,则分析出完整的运算数,该运算数直接送入S2栈
(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否者,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。
(3)若取出的字符是“(”,则直接送入S1栈栈顶。
(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
(5) 重复上面的1~4步,直至处理完所有的输入字符
(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。
完成以上步骤,S2栈便为后缀表达式输出结果。不过S2应做一下逆序处理。便可以按照后缀表达式的计算方法计算了。
一般运算符 --------------------------- 运算符栈的栈顶运算符 | + - * / ( ) # |
+ - * / ( ) # | > > < < < > > > > < < < > > > > > > < > > > > > > < > > < < < < < = > > > > > > < < < < < = |
举例子:将中缀表达式A+(B-C/D)×E转换成后缀表达式
步骤 | 中缀表达式 | STACK(栈) | 输出后缀表达式 |
1 | A+(B-C/D)×E# | # | |
2 | +(B-C/D)×E# | # | A |
3 | (B-C/D)×E# | # + | A |
4 | B-C/D)×E# | # +( | A |
5 | -C/D)×E# | # +( | AB |
6 | C/D)×E# | # =(- | AB |
7 | /D)×E# | # +(- | ABC |
8 | D)×E# | # +(-/ | ABC |
9 | )×E# | # +(-/ | ABCD |
10 | )×E# | # +(- | ABCD/ |
11 12 | )×E# ×E# | # +( # + | ABCD/ - ABCD/ - |
13 | ×E# | # + | ABCD/ - |
14 | E# | # + × | ABCD/ - |
15 | # | # + × | ABCD/ -E |
16 | # | # + | ABCD/ -E × |
17 | # | # | ABCD/ -E × + |
技巧:把操作数依次(运算顺序)写下来,然后将运算符写在两个操作数之后。比如:
a * ( b + c) - d --> bc+ ---> abc+* ---> abc+*d-