JavaScript 兑现的科学计算器,支持四则运算和函数,采用Postfix Notation算法

JavaScript 实现的科学计算器,支持四则运算和函数,采用Postfix Notation算法

居然距离上次更新博客有两年时间,说明这段时间我真的是非常非常忙,且没有什么新的知识学到?忙是真的,但是两年来学到很多很多东西,但多数都是软件工程方面或者其他的而不是开发技术上的,希望以后能有更多时间来更新自己的技术博客。

 

这也是我做软件民工多年来难得一次机会去考虑一个算法的实现,最后由于能力不济改为改写别人写好的代码,原文请见:http://vvggsky.iteye.com/blog/290540。但是仍然很有帮助,所以把整个代码(HTML/JavaScript)贴上来,也许会对其他童鞋也有帮助。

 

由于不是科班出身,以前我并不知道有这么一个后置算法(Postfix Notation),自己摸索着按照简单计算器的思路先做了一个,但是做到后面发现解析复杂表达式比如ABC/A*(C + X) + CDE*F 这种就捉襟见肘,最后完全败下阵来,打掉重做。

 

在解析这种表达式的时候有这样一个固定算法来解决,才会保证任意复杂度的表达式都可以得到预想的结果,它甚至支持sqrt(AB*C)/F这样的含有函数的表达式。

 

思路(好像这个东西让我来说有点班门弄斧,各位看官见谅:P):

1. 这个算法的核心就是把中置表达式(运算符处于运算子中间)转移到后面,与此同时,根据操作符的优先级将运算符和运算子按照一定顺序压入一个栈。这样做的好处之一就是让括号失效,而使得注意力集中在操作顺序上(计算顺序是解析表达式的关键)。

2. 真正的计算,因为在前面的后缀转换过程中,已经将运算符和运算子按照操作顺序压入栈,计算时仅仅需要将栈内元素按照顺序弹出,遇到运算子压入另外一个栈stack2,遇到运算子则将stack2栈顶两个运算子拿出来与这个运算符做计算即可。

3. 对于函数,需要一些特定的处理,因为函数是接受不同长度的参数,比如sqrt(x), pow(x,y),我并没有想出一个通用解析方法,在处理函数的时候是对函数名最为一个特殊的操作符(留意','的处理),由于后置算法的健壮度,这种函数得到了良好的支持,扩展性也比较好

4. 定义操作符优先级比较重要:+/- 为1,*// 为2,函数则为3最高,括号比较特殊为0,因为要将括号作为计算边界

对于具体思路,参考http://www.google.com.sg/url?sa=t&source=web&cd=1&ved=0CBcQFjAA&url=http%3A%2F%2Fwww.eel.tsint.edu.tw%2Fteacher%2Fthjean%2Fmultimedia%2Fc12.ppt&ei=GC3OTe0Cy8utB8TTzcIK&usg=AFQjCNG3WfJcyFAJgPyUzkzuVYgPzol1-Q&sig2=-HQ6M1QxfNAP71TcuSlqVQ,是一个*人写的算法PPT,提供具体的算法解释甚至包括插图解说,实属入门新手利器,推荐。

 

为方便起见,我选择JavaScript/HTML来制作这个小实现,包含算法实现、测试和一定的介绍(英文)你可以直接下载运行,因为时间比较仓促,还有很多地方可以改善