用算法来实现简单表达式(指只包含+-*/四则运算及括号的表达式)求值的困难在于无法从表达式直接确定运算的顺序。因为我们常用的表达式形式是:表达式+运算符+表达式(即中缀表达式)。我们无法确定“运算符”与后面表达式中包含的运算符的优先级关系。
利用二叉树和堆栈结构可以很好的解决这个问题。
我们知道,一个表达式的运算顺序是确定的,所以我们需要将这种中缀表达式转换为一种确定顺序的运算表达式。可以利用二叉树后序查找方式,把运算值作为叶子节点,运算符作为非叶子节点,可以得到表达式的二叉树结构。括号只是确定优先级,不插入树。
1、第一个值作为叶子节点;2、第一个运算符作为该叶子节点的父节点;3、紧跟的表达式根据运算的优先级进行插入,若后一个运算的优先级高则将表达式作为当前父节点的右孩子节点,否则做为该父节点的父节点;4、按照3的方法依次插入直到表达式完毕。
例如 a+b*c-(d -e/f)*g的后序二叉树为
然后进行一次后序查找就得到了后缀表达式: abc*+aef/-g*-
说明:这种方法形成的树严格来说不是二叉树,因为二叉树节点都是有序的。这里只是借鉴来说明表达式求取过程。
利用后缀表达式求值:因为操作数总是在操作符的前面,所以可以利用堆栈结构配合出栈入栈的动作实现表达式的求值。
1、设置一个栈,开始时,栈为空;2、然后从左到右扫描后缀表达式,若遇操作数,则进栈;3、若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕;4、最后,栈中仅有一个元素,即为运算的结果。