四则运算的简单表达式求值

用算法来实现简单表达式(指只包含+-*/四则运算及括号的表达式)求值的困难在于无法从表达式直接确定运算的顺序。因为我们常用的表达式形式是:表达式+运算符+表达式(即中缀表达式)。我们无法确定“运算符”与后面表达式中包含的运算符的优先级关系。

利用二叉树和堆栈结构可以很好的解决这个问题。

我们知道,一个表达式的运算顺序是确定的,所以我们需要将这种中缀表达式转换为一种确定顺序的运算表达式。可以利用二叉树后序查找方式,把运算值作为叶子节点,运算符作为非叶子节点,可以得到表达式的二叉树结构。括号只是确定优先级,不插入树。

1、第一个值作为叶子节点;2、第一个运算符作为该叶子节点的父节点;3、紧跟的表达式根据运算的优先级进行插入,若后一个运算的优先级高则将表达式作为当前父节点的右孩子节点,否则做为该父节点的父节点;4、按照3的方法依次插入直到表达式完毕。

例如 a+b*c-(d -e/f)*g的后序二叉树为

 

然后进行一次后序查找就得到了后缀表达式: abc*+aef/-g*-

说明:这种方法形成的树严格来说不是二叉树,因为二叉树节点都是有序的。这里只是借鉴来说明表达式求取过程。

利用后缀表达式求值:因为操作数总是在操作符的前面,所以可以利用堆栈结构配合出栈入栈的动作实现表达式的求值。

1、设置一个栈,开始时,栈为空;2、然后从左到右扫描后缀表达式,若遇操作数,则进栈;3、若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕;4、最后,栈中仅有一个元素,即为运算的结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值