后缀表达式求值

什么是后缀表达式

一般我们常见的表达式为中缀表达式,比如2+3*4这样的形式,操作符在两个操作数之间。那么后缀表达式,显而易见就是操作符在操作数之后的形式了,比如2 3 4 * +。后缀表达式也叫做逆波兰表达式,传送门。

为什么要用后缀表达式

很直观的一个原因就是,后缀表达式不用考虑运算符优先级、不用考虑括号等,可以顺序计算,可以很方便的用程序实现。

准备工作

一般人们输入的都是中缀表达式,如果要用后缀表达式来计算的话,我们首先应该把中缀表达式转换成后缀表达式。

基本条件

l  为了描述简单起见,我们假设表达式只包含+-*/四种运算,包括(),支持负号。运算符优先级*=/ > +=- > (。

l  表达式中的操作数提取,很简单不深入讲解,以a,b,c等字符代替表达式中的操作数。

转换步骤

1.    创建一个操作符栈,一个字符串(用来放后缀表达式)

2.    依次遍历表达式中的字符,判断是字符还是操作数

l  如果是操作数,则直接放入后缀表达式中。

l  如果是操作符,则要判断是不是括号、或者其它操作符

1.    如果是普通操作符,能直接放入操作符栈中的条件:栈为空或者当前操作符优先级比栈顶元素高。如果当前元素没有栈顶元素高,则栈顶元素出栈并放到后缀表达式中,当前操作符和下一个栈顶元素比较,直到栈为空或者当前操作符优先级高于栈顶元素。

2.    如果是左括号则直接放入操作符栈。

3.    如果是右括号,则栈顶元素依次出栈,放入后缀表达式,直到遇到左括号。

3.    最后将操作符栈中的元素依次弹出放到后缀表达式中。

进行完这些步骤,则得到后缀表达式。流程图如下:

举例说明

A*(B+C)/D+E

原始表达式                   后缀表达式                      操作符栈

A*(B+C)/D+E                 

*(B+C)/D+E                   A

(B+C)/D+E                    A                               *

B+C)/D+E                     A                               *(

+C)/D+E                      AB                              *(

C)/D+E                       AB                              *(+

)/D+E                        ABC                             *(+

/D+E                         ABC+                           *

D+E                          ABC+*                          /

+E                           ABC+*D                         /

E                            ABC+*D/                         +

                            ABC+*D/E                        +

                             ABC+*D/E+


待补充.....

你可能感兴趣的:(后缀表达式求值,逆波兰表达式,算术表达式,中缀表达式转后缀,栈应用)