表达式,转换和计算,用C语言描述--Part3

转载 2004年08月18日 17:08:00

表达式,转换和计算,用C语言描述--Part3
(关于表达式的所有你应该知道的东西)

其余转换 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

所有剩余的转换都可以轻易地用二分表达式树来完成。事实上,上面的两种转换,也即中缀->前缀和中缀>后缀,也能用二分树来做,但是技巧性太强,而用栈来完成就容易得多。现在我们继续讲解,首先对二分表达式树下一定义。

二分表达式树

表达式树是严格的二分树,叶节点存放操作数,非叶节点存放运算符,根节点存放用于计算左子树和右子树计算结果的运算符。一旦我们得到了某一特定表达式的树,将它转换成各种不同的表示形式(中缀,前缀和后缀)以及计算其值都只需要遍历这棵树就可以了。下图展示了前面的表达式2*3/(2-1)+5*(4-1)对应的表达式树。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> CSDN_Dev_Image_2004-5-62356440.gif

 

注意:二分表达式树不包含括号,原因在于用树结构计算表达式值的时候,表达式树本身的结构就已经决定了计算的顺序。

当我们先序遍历(先访问根节点,再依次访问左儿子和右儿子)表达式树时,得到的是此表达式的前缀表示,类似地,后序遍历(先依次访问左儿子,右儿子,再访问根节点)将得到后缀表示。如果中序遍历(依次访问左儿子,右儿子,根节点)表达式树我们会得到什么结果呢?对于不包含括号的表达式,中序遍历将得到它的确定的中缀形式,但对那些用括号来改变运算符间优先次序的表达式,简单的中序遍历就不能将其还原成原来的中缀形式。

用表达式树完成各种表示形式间的转换


前缀->中缀

后面的算法适用于其中缀形式中没有用括号来改变运算符间原有优先次序的表达式。
1
)根据前缀表达式创建一棵表达式树
2
)中序遍历这棵树


前缀 ->后缀

1
)根据前缀表达式创建一棵表达式树
2
)后序遍历这棵树


你看这是多么容易啊!关键之处在于根据前缀表达式创建表达式树,下面的算法完成了这项工作:

根据前缀表达式创建表达式树的算法
1
)求前缀表达式的逆序
2
)检查输入的下一元素
3
)假如是操作数,则
   i)
创建一个叶节点,也就是没有儿子的节点(node- >left_child=node->right_child=NULL
   ii)
将操作数赋给叶节点的data分量
   iii)
叶节点地址入栈
4
)假如是运算符,则
   i)
创建一个节点
   ii)
运算符赋给该节点的data分量
   iii)
栈顶节点地址出栈,并将其赋值给新节点的left分量,即node->left_child
   iv)
栈顶节点地址出栈,并将其赋值给新节点的right分量,即node->right_child
   v)
新节点地址入栈
5
)假如输入还未结束,跳转到步骤2
6
)假如输入结束,栈中节点地址出栈,此地址即为整个树的根节点地址

前缀表示转换成中缀和后缀表示的算法参考程序#2

后缀->中缀
同前,这里的算法也是只适用于其中缀形式中没有用括号来改变运算符间原有优先次序的表达式。
1
)由后缀表达式创建表达式树
2
)中序遍历该树

后缀->前缀
1
)由后缀表达式创建表达式树
2
)先序遍历该树

根据后缀表达式创建表达式树的算法
1) 检查输入的下一元素
2
)假如是操作数,则
   i
)创建一个叶节点,也就是没有儿子的节点(node- >left_child=node->right_child=NULL
   ii)
将操作数赋给叶节点的data分量
   iii)
叶节点地址入栈
3)
假如是运算符,则
   i)
创建一个节点
   ii)
运算符赋给该节点的data分量
   iii)
栈顶节点地址出栈,并将其赋给新节点的right分量,即node->right_child
   iv)
栈顶节点地址出栈,并将其赋给新节点的left分量,即node->left_child
   v)
新节点地址入栈
4)
假如输入还未结束,跳转到步骤2
5)
假如输入结束,栈中节点地址出栈,此地址即为整个树的根节点地址

上述算法参考程序#2

好了,最终我们可以完称表达式的任意两表示形式的转换了。这里我们对前面的内容作一小节:
1)
中缀->前缀,用栈
2
)中缀->后缀,用栈
3)
前缀->中缀,用表达式树
4)
前缀->后缀,用表达式树
5)
后缀->中缀,用表达式树
6)
后缀->前缀,用表达式树

现在我们所剩下的问题就是如何计算表达式的值了。计算一个表达式的包含两个步骤:
1
)创建给定表达式所对应的二分树
2
)递归地计算这棵树的值
(
按照文中方法,对一个普通的中缀表达式我们要经过中缀->前缀或后缀->表达式树->递归算值的过程。其实也可以用栈直接由中缀形式计算表达式的值――译者注)


下面的函数将用递归的方法计算一个表达式树的值:
函数名:EvaluateTree,参数:根节点地址

 int EvaluateTree (struct node* root)

IF root != NULL

            IF current node contains an operator
                        x = EvaluateTree(root -> left_child)
                        y = EvaluateTree(root -> right_child)
                        Perform operation on x and y, specified by the 

                        operator and store result in z
                        Return z
            else Return root->data

Refer program #2 for evaluation of an Expression Tree.
参考程序#2计算表达式树的值的算法。

c语言算术运算表达式与赋值运算表达式的类型转换规则

一.算术表达式的类型转换规则 1.对于单精度实型操作数,系统先将表达式中所有单精度实型(float型)操作数(常量或变量)转换为双精度实型,在参与运算。 2.对于字符型操作数,系统先将表达式中所有...
  • nice_catch
  • nice_catch
  • 2016年08月11日 16:52
  • 1288

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

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

C语言栈实现表达式计算器

栈实现计算器 黑色印记 前段时间利用栈写了一个实现了计算器功能的程序。觉得有意思的,因此今天在这了和大家分享一番。 首先,要写出计算器,你要按照以下几点去写,才能保证运算的优先级不发...
  • zwt0112
  • zwt0112
  • 2017年01月15日 15:52
  • 2911

C语言函数参数中的表达式顺序问题

偶然一次遇到一个C程序,
  • Hackeris
  • Hackeris
  • 2014年06月27日 23:58
  • 1682

算数表达式求值(C语言)

利用栈实现的简单四则运算
  • Yeziquanquan
  • Yeziquanquan
  • 2016年09月06日 20:18
  • 1363

C语言实现整数四则运算表达式的计算

一、问题重述 【问题描述】 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。计算表达式结果,并输出。 要求: 1、表达式运算符只有+、-、*、/...
  • dannis_bh
  • dannis_bh
  • 2016年03月29日 02:24
  • 6300

C语言::将中缀表达式转换为后缀表达式并计算结果

百度上都是算法,没找到代码,于是顺手就写了一个出来........
  • gaoben668
  • gaoben668
  • 2016年06月03日 14:51
  • 4222

c语言数据结构实现后缀表达式求值

通常人在书写的时候习惯是书写中缀表达式,然而在计算机处理的时候中缀表达式的效率远小于后缀表达式,即操作数在前面,运算符在后面例如: 中缀表达式 A+B     后缀表达式AB+            ...
  • woshinannan741
  • woshinannan741
  • 2015年11月29日 12:35
  • 9580

C语言表达式和表达式的值

今天突然发现如果能很好的理解表达式
  • dscyw
  • dscyw
  • 2014年05月14日 19:11
  • 2706

C语言中数据类型之间怎样进行强制转换?

C语言是编程语言的根本,所以很多高校都为计算机专业的学生开设了C语言课程。数据类型是学习C语言的根本,今天,我就给大家介绍一下C语言中各数据类型之间的强制转换。   在讲数据类型强制转换之前,我先讲...
  • bentengdehe
  • bentengdehe
  • 2016年05月05日 17:21
  • 4216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:表达式,转换和计算,用C语言描述--Part3
举报原因:
原因补充:

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