表达式,转换和计算,用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语言::将中缀表达式转换为后缀表达式并计算结果

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

C语言 算数表达式求值(顺序栈应用实例)

//顺序栈的应用:表达式求值 //允许用户输入空格(系统自动删除),只能进行整数的四则运算,支持小括号 //对不能整除的将按两个整数除法规则进行取整 //作者:nuaazdh //时间:201...
  • nuaazdh
  • nuaazdh
  • 2011-12-08 22:18:44
  • 12069

用一个条件表达式描述从a,b,c中找出最大者赋值给max

#include int main() { int a,b,c,max; printf("Please input three numbers:\n"); scanf("%d %d ...
  • fd315063004
  • fd315063004
  • 2011-09-21 11:37:52
  • 2473

76C语言实现表达式计算

一、设计思想;两种算法首先都要建立两个栈,一个是存放操作数的数;中缀转后缀再计算的算法;此算法的基本思路是先将中缀表达式转换成后缀表达式;首先,用一个char数组将中缀表达式读入,对数组;第二步,读出...
  • qq_36125733
  • qq_36125733
  • 2017-02-12 16:30:49
  • 307

栈的操作和c语言实现算术表达式求值

栈是一种特殊的线性表,anzh
  • guihailiuli
  • guihailiuli
  • 2014-11-07 21:36:18
  • 4802

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

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

c语言实现中缀表达式向后缀表达式转换

  • 2010年11月02日 19:54
  • 4KB
  • 下载

C语言实例编程:回溯法计算总费用最小费用

/*   假设需要将N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不   同.下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配   1个不同的任务...
  • diaoguangqiang
  • diaoguangqiang
  • 2013-11-26 09:48:42
  • 514

c语言:表达式求值实现(包含加减乘除括号)

这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油!   之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘...
  • qq_28598203
  • qq_28598203
  • 2016-04-12 09:50:40
  • 4305

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

通常人在书写的时候习惯是书写中缀表达式,然而在计算机处理的时候中缀表达式的效率远小于后缀表达式,即操作数在前面,运算符在后面例如: 中缀表达式 A+B     后缀表达式AB+            ...
  • woshinannan741
  • woshinannan741
  • 2015-11-29 12:35:53
  • 11352
收藏助手
不良信息举报
您举报文章:表达式,转换和计算,用C语言描述--Part3
举报原因:
原因补充:

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