后缀表达式 (2) —— 表达树与后缀表达式的运算

原创 2016年08月30日 16:00:45

后缀表达式的表达树

在上一篇博客 后缀表达式(1)中已经提到过,后缀表达式的优点在于它便于计算机和识别与处理。我们编程解析后缀表达式的过程,其实是生成该表达式的表达树的过程。虽然我们并不一定在代码中显式地把这棵树构造出来,但我们确实隐含地运用了表达树的结构。因此,手工把这棵表达树画出来,对于理解后缀表达式的运算过程非常有用。

这里,我们依然假设运算符都是二元的,这样构造出来的表达树必然是一个二叉树。对于一个给定的后缀表达式,它表达树的根节点是该表达式最外层的运算符。根节点的左右子树分别为该运算符的第一个和第二个运算元。这两个运算元可能是树,也可能是后缀子式对应的表达树。

例. 对于如下后缀式

ab+

其对应的表达树为

        +
       / \
      a   b

例. 考虑一个稍微复杂的后缀式

abc+

首先看到它的最后一个字符是加号+,这说明这个后缀式的最外层运算是加法运算,故而根节点为+。见下图。

   +
  / \

加号之前的字符串abc表示了这个加法运算的两个运算元。

按照后缀式的性质,最后一个字符-一定是属于加法运算的第二个运算元。由于第二个运算元以运算符结尾,所以它也是一个后缀式。 见下图。

   +
  / \
 /   -
    / \

接下来, 字符串abc中包含了减法运算的两个运算元,和加法运算的第一个运算元。根据后缀式的性质,最右边的字符c属于减法运算的第二个运算元,而字符b属于减法运算的第一个运算元。最后a属于加法运算的第一个运算元。见下图。

   +
  / \
 /   -
a   / \
   b   c

注意: 在后缀式的表达树中,每一个运算符对应的是表达树的非叶子节点,而每个字母,对应的是表达树的叶子节点。在构造后缀式的表达树时,我们总是把字符串中的最后一个字符放在表达树中最右边的非满节点下

例. 考虑下面的复杂的例子

abc+defg/+hij

首先最右边的字符是减号,构造根节点如下图,剩下的字符串为abc+defg/+hij

   -
  / \

在字符串abc+defg/+hij中,最右边的字符为减号-,放到根节点下得下图,剩下的字符串为abc+defg/+hij

   -
  / \
    -
   /  \

在字符串abc+defg/+hij中,最右边的字符为乘号,放在最右边的减号下得下图,剩下的字符串为abc+defg/+hij

   -
  / \
    -
   /  \
       *
      / \

将字符串abc+defg/+hij最右边的两个字符ij放在最右边的乘号下得下图。剩下的字符串为abc+defg/+h

   -
  / \
    -
   /  \
       *
      / \
     i   j

接下来,节点i和j是叶子节点,乘号节点已经满了,因此最右边的非满节点为第二层的减号节点。故应该将字符串abc+defg/+h的最后一个字符h放到该节点下。见下图。剩下的字符串为abc+defg/+

   -
  / \
    -
   /  \
  h    *
      / \
     i   j

接下来,唯一的非满节点是根节点。这表示根节点的第二个运算元已经生成完毕。我们将最右边的加号字符放到根节点下,得到下图。剩下的字符串为abc+defg/

     -
    / \
   /   \
  /     \
 +       -
/ \     /  \
       h    *
           / \
          i   j

接下来,唯一非满的节点为根号节点,故将字符串abc+defg/中最右边的字符除号/放在加号节点下得下图。剩下的字符串为abc+defg

     -
    / \
   /   \
  /     \
 +       -
/ \     /  \
  (/)  h    *   注意:这一行的/表示除号。
  / \      / \
          i   j

字符串abc+defg中最后两个字符放在表达树第三层最左边的乘号下得下图。剩余的字符串为abc+def

     -
    / \
   /   \
  /     \
 +       -
/ \     /  \
  (/)  h    *  注意:这一行的/表示除号。
  / \      / \
 *   g    i   j
/ \

将字符串abc+def最右边的子串def依次填进表达树得下图。剩下的字符串为abc+

      -
     / \
    /   \
   /     \
  +       -
 / \     /  \
   (/)  h    *  注意:这一行的/表示除号。
   / \      / \
  *   g    i   j
 / \
d   -
   / \
  e   f

最后得到的表达树为

                -
               / \
              /   \
             /     \
            /       \
           /         \
          /           \
         +             -
        / \           /  \
       /   \         /    \
      /     \       /      \
     /       \     /        \
    /         \   /          \
   +         (/)  h           *  注意:这一行的/表示除号。
  / \        / \              / \
 a   *      *   g            i   j
    / \    / \
   b   c  d   -
             / \
            e   f

后缀表达式的运算

一旦后缀表达式的表达树生成好了,那么后缀表达式的运算可以通过自底向上的方法实现。这里仅以一个简单的例子作为说明。

前面已经介绍过后缀式

abc+

的生成树为

   +
  / \
 /   -
a   / \
   b   c

现在假设

a=9b=7,c=2.

于是表达树变为

   +
  / \
 /   -
9   / \
   7   2

先计算以减号为根节点的子树,即72=5。于是表达树变为

    +
   / \
  9   5

最后结果为14。

版权声明:本文为博主原创文章,转载请注明出处和作者。

后缀表达式转表达树

表达式树 用到了栈,并且递归实现了中序遍历,后序遍历,前序遍历。 同时应该学会union的使用方法。 基础知识: 一、表达式树      ...
  • laizhengbo20hao
  • laizhengbo20hao
  • 2014年08月08日 15:24
  • 1172

用后缀表达式计算四则运算算法

1*2+3*4, 这个对应的中缀表达式就是[1,*,2,+,3,*,4], 需要转换成后缀表达式[1,2,*,3,4,*,+], 才能进一步计算得到结果.1.得到后缀表达式需要准备两个容器, 符号栈 ...
  • chuchus
  • chuchus
  • 2017年04月24日 11:15
  • 639

后缀表达式(3)——后缀表达式的计算,递归实现

有了博客后缀表达式(2)的分析,要实现后缀表达式的计算已经非常容易了。   首先,我们构造一个结构体。这个结构体表示后缀表达式中的一个元素。这个元素可能是运算符,也可能是运算元。这里我们假设运算符有加...
  • hedan2013
  • hedan2013
  • 2016年09月05日 16:33
  • 605

从后缀表达式建立表达式树

怎么想起总结算法了 在一个公司呆久了,不出去看看,你永远不知道你的水平如何,你值多少钱。也就是说,作为一个技术人员,应该每隔4、5个月,出去参加几次面试,看看自己的技术水平有没有和IT圈脱节。但...
  • arsaycode
  • arsaycode
  • 2017年04月24日 16:02
  • 397

一个算数表达式的前缀中缀和后缀(可进行负数运算)

一个算数表达式的前缀中缀和后缀目录一个算数表达式的前缀中缀和后缀 目录 关于前缀中缀和后缀 中缀转前缀后缀的算法思想 代码实现 1. 关于前缀、中缀和后缀 中缀表达式:就是我们常见的算数表达式,有优先...
  • starexplode
  • starexplode
  • 2017年07月25日 20:06
  • 724

后缀表达式转换表达式树

public class BinaryNode { public Character value; public BinaryNode left; publ...
  • u012619033
  • u012619033
  • 2014年01月10日 11:26
  • 1070

前中后缀表达式以及表达式树

中缀表达式就是我们平时喜闻乐见的
  • simon_uestc
  • simon_uestc
  • 2014年07月31日 20:59
  • 1602

使用c语言实现后缀表达式计算器

使用栈来进行后缀表达式计算,流程:从前向后读取后缀表达式的项目,遇到数值压入栈中,遇到运算符pop出栈顶的两项做运算,运算结果再放入栈中直到= 例子:求后缀表达式4x*2x*a-c*+=? ...
  • iOSTerry
  • iOSTerry
  • 2016年06月16日 23:10
  • 1979

中缀表达式转换成后缀表达式 计算后缀表达式的值 幂操作符添加到你的指令系统中去

数据结构与算法分析——c语言描述 练习3.19 3.20 a b 答案 这道题以前发过文章。现在能支持幂^了。 栈的利用 挺重要的一个思想是 操作符 根据优先级分级 #include #inc...
  • qq789045
  • qq789045
  • 2016年03月28日 00:10
  • 641

用栈实现后缀表达式求解问题

一、问题概述: 人们经常书写的数学表达式属于中缀表达式,今天要解决的是,后缀表达式的求解问题。 如下图分别为举例的中缀表达式和后缀表达式: 二、解决思路 我们用栈存储后缀表达式...
  • xxpresent
  • xxpresent
  • 2016年11月29日 14:55
  • 1302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:后缀表达式 (2) —— 表达树与后缀表达式的运算
举报原因:
原因补充:

(最多只允许输入30个字)