在后缀表达式的过程中,由于运算顺序不唯一,所以我们手算过程中对应的后缀表达式也不唯一。 Eg:A + B * ( C - D ) - E / F,在表达式中,我们如果先算括号里的表达式,那么它所对应的运算顺序为: 在该表达式中,它所对应的后缀表达式为:A B C D - * + E F / -。 但是,在这个表达式中,如果我们先算最右侧的 E / F,结果也不会出错,所以我们可以得到一个与上面不一样的运算顺序,而它所对应的后缀表达式应该为:A B C D - * E F / - +。 在这个表达式中,由于我们所规定的运算顺序不同,在同样的中缀表达式中得到了不同的后缀表达式,这显然是不符合算法的确定性的。因此,我们便需要通过一些约定来对它进行改变。我们约定只要左侧的运算符能先运行,那么我们就先运行左侧的运算符。 同样是以 A + B * ( C - D ) - E / F为例,在遵循约定后,括号内的内容和最右侧的除法都可以先运行的情况下,我们先运行左侧的,那么处理的结果为:C D - 。此时B * (C - D)与最右侧的E / F都可以先运行,我们依然遵循左侧先运行的原则,那么结果为:B C D - * 。此时A + B*(C-D)与最右侧的E/F都可以运行,我们依然遵循左侧先运行的原则,那么结果为:A B C D - * +。此时我们只剩最右侧的- 与 / 两个操作符了,/的优先级高,因此我们先将E/F转为相应的后缀表达式:E F /,将其拼接到原有的后缀表达式中,得到的结果为:A B C D - * + E F /。最后将的运算应该是将-两边得到的表达式进行运算,那么最终得到的后缀表达式就为:A B C D - * + E F / -
1.最右侧的 E / F与中间括号的都可以先运行,但我们需要遵循右优先的规则,先运行右侧的表达式。
所以需要先将 E / F转为对应的前缀表达式:/ E F
2.此时应该计算的应该是括号中的内容,此时并没有可以和它同时运行的表达式,因此可直接转换。
得到的结果为:- C D
3.在转换完(C-D)的表达式后,下一步运算的应该是 B*(C-D)的结果,此时没有可以和它同时运行的表达式,可直接转化,得到的结果为:* B - C D
4.在计算完*、/、()这些表达式后,剩下的操作符只剩左侧的+与右侧的-,这两个表达式都可以先运行,我们遵循右优先原则,得到的结果为:- * B - C D
5.最后计算A +后面的表达式,得到的结果为:+ A - * B - C D