用VisualC#实现四则混合运算
介绍了一种用Visual C#实现初等算术自动计算的方法。在...的框架内。net1.1,没有现成的类。不过,现在经过我们下面的介绍,大家都可以自己写一个了。它的功能什么都不是。只是你熟悉了栈的用法,或者家里有个小学生,你可以写个程序让孩子练习初等算术。哈哈,别说太多废话了。让我们言归正传。
举一个典型的算术题:(6+2*5)/4
从题中我们先算出2*5=10,再算出6+10=16最后算出16/4 =4。所以,结果是4。
电脑呢?好在前辈给我们列举了一堆算法,我们随便选一个就行了。
第一种算法
用栈来解决问题,就是把最低的一个推到栈底。按照先进后出的原则,第一阶段最低的一个就是最终计算。
计算过程:
我们先搭建两个栈,一个是数据栈,一个是计算符号栈。以(6+2*5)/4为例,看看现实世界是如何计算的。
假设:
1)优先级
符号之间的优先级如下:
"(" ")" -1
“+”、“-”0
“*”、“/”1
值越大,优先级越高,在同级比较中最先出现的优先。
2)设置“(“,”)为特殊算子,即单目运算,相邻两个算子可以相互抵消。
3)计算条件
(1)当前运算符不等于" "(特殊终止符)
(2)当算子栈中正在运行的算子的数量> =1时
(3)当出口端口的操作符优先级高于要放入栈的操作符优先级时,或者两个操作符可以互相取消。
计算时,将符号推出堆栈参与计算,将数值堆栈出口的前两个元素推出堆栈参与计算,并将计算结果值推送到数值堆栈,递归执行此操作。
1)"("被压入符号栈2) "6 "被压入值栈。
3)”(“将优先级与“+”进行比较,认为“(”低于“+”,则不满足计算条件,将“+”推入符号栈。
1)按“2”进入数值堆栈。
2)比较“*”和“+”的优先级,如果“+”的优先级低于“*”,则不满足计算条件,将“*”推入符号栈。
1)按“5”进入堆栈。2)比较“*”和“)”的优先级,得到“*”的优先级高于“)”。执行计算,将“*”、“5”和“2”推出堆栈,参与计算。
1)将2*5 =10的结果推入值堆栈。
2)(递归)比较“+”和“)”优先级,得到“+”高于“)”优先级。再次计算,将“+”、“10”和“6”推出堆栈参与计算。
1)将6+10 =16的结果推入值堆栈。
2)(递归地)比较“)”和“(”的优先级,得出两者可以互相抵消的结论。从堆栈中移除“(”符号,用“)”取消它,并移动到下一个符号。
1)将“/”放入符号堆栈。
2)将“4”放入值堆栈。
3)如果找到公式的末尾,就会计算。你会叠加“/”、“4”、“16”,参与计算。
1)将计算结果压入数值堆栈。
成功了!计算的辛苦终于做完了,看起来比人脑计算复杂多了:)
第二种算法
第二种方法,先简单提一下,这里不描述详细过程。第二种方法是用树的方法把一个公式组织成一棵正则树,然后遍历计算得到结果。或者以上面的公式为例,最后形成树形样式:(注意符号“()”需要特殊处理)
使用树的深度遍历来计算最终结果。
0条评论