对于四则混合运算其实在大三的时候就接触过,但是由于当时自己太菜,只顾着玩游戏跳课了。所以这个算法一直没有用代码实现过。当时学霸还给我简单的讲了一下方法,只因身为学渣的我,只想对学霸说一句,道理我都懂,但是用代码怎么实现的呢。
这次写这个实现四则混合运算功能的原因是,在项目中看到大牛写了一个关于这个的功能,但是他用的是遍历二叉树和递归的原理,并且这段代码是在一个比较大的项目中层次结构比较复杂,实话说,我看得是似懂非懂,所以想自己实现一下,在下面可以提一下我对大牛写的代码的原理的理解,可能不是很对。
今天说的也是利用了二叉树遍历的知识,不过没有对二叉树进行操作,只是利用了二叉树的中序与后序遍历的知识。下面将讲解一下四则混合运算的原理,然后上部分代码。
一 . 原理
1. 中序表达式和后序表达式
例如表达式(A+B)C+E/D,我们试图将它分解,放到一个二叉树中,那么怎么放到一个二叉树中的,我们可以将这个表达式中的元素拆解成三个部分:
(A+B),C,E/D
我们发现A+B是二叉树A+B中序遍历的结果。令A+B的结果是F,则FC是F*C中序遍历的结果,依次类推,可以得出二叉树如下:
我们将这个二叉树进行中序遍历得到的就是如上的表达式。那么为什么要说这个呢。我们光看这个二叉树中序遍历的结果,对这个表达式进行词法分析,是得不出什么算法的。但是我们可以对这个二叉树的后序遍历得到的表达式进行词法分析的。
这个二叉树后序遍历的结果是:AB+CED/+
通过对后序表达式的词法分析,我们令F=A+B,G=FC,H=E/D,I=G*H,这样我们就可以得到一个解决方法:每次遇到一个操作符,就将操作符的前两个操作数与该操作符进行计算。
现在大概的思路有了,那么中间需要解决的核心问题有如何将中序表达式转换成后序表达式?如何对后序表达式进行计算?那么且往下看。
2. 运算符优先级
首先要说明的是这里的优先级不是四则运算中优先级那么简单。我先列出一张优先级表,然后再说明情况:
这个表显示的是栈外的运算符与栈内运算符之间对比的优先级表。
我们可以将上面的表达式入队,然后进行压栈和出栈操作,来得出后序表达式。在表达式后面加一个“#”运算符,那么表达式就是(A+B)*C+
c# 四则混合运算算法
于 2015-12-13 02:10:07 首次发布