继续表达式求值—支持函数
作者 佚名技术
来源 服务器技术
浏览
发布时间 2012-07-12
这次做的和上次那个方法不同,上次是将中缀表达式转换 为后缀表达式,再利用堆栈求值,所以对函数就不知道如何做了; 而这次用的方法则完全是按人脑的计算过程,从左到右,从内至外, 函数运算也实现了,而且参数个数也没有限制,添加也很方便 目前已添加的函数有sin(),cos(),max,min(),sin和cos采用角度制 另外,这个同样也是可以使用变量的,供测试的变量有m,n,y,x, 程序中所有变量都可用,但有些是不能做算术运算的^_^ 点击浏览该文件 参考(很受启发): http://www-900.ibm.com/developerWorks/cn/Java/j-w3eva/index.sHTML#resources -------------------AS如下------------------ var ostr = "+,-,*,/,%,^"; var fstr = "sin,cos,max,min"; //获取运算符的优先级,非运算符的优先级为0 function isp(optr:String) { switch (optr) { case "+" : case "-" : return 1; case "*" : case "/" : case "%" : return 2; case "^" : return 3; default : return 0; } } //判断操作数的类型(数字或变量)并作相应处理 function getNum(str:String) { var ch = str.substr(0, 1); if ((ch<"0" || ch>"9") && ch != "-") { return eval(str); } else { return Number(str); } } //运算符的具体运算 function func(optr:String, va:Array) { for (var i in va) { va[i] = getNum(va[i]); } switch (optr) { case "+" : return va[0]+va[1]; case "-" : return va[0]-va[1]; case "*" : return va[0]*va[1]; case "/" : return va[0]/va[1]; case "%" : return va[0]%va[1]; case "^" : return Math.pow(va[0], va[1]); case "sin" : return Math.sin(va[0]/180*Math.PI); case "cos" : return Math.cos(va[0]/180*Math.PI); case "max" : return Math.max(va[0], va[1]); case "min" : return Math.min(va[0], va[1]); } } //找出最里层的括号,并返回括号的起始位置及括号内的表达式 function godepth(estr) { var e = estr.indexOf(")"); var s = estr.lastIndexOf("(", e); estr = estr.slice(s+1, e); var obj = {s:s, e:e, estr:estr}; return obj; } //计算带括号和函数的表达式 function toNum2(estr, ostr, fstr) { var i, JHTEMP, obj = godepth(estr), hasfunc = ""; fstr = fstr.split(","); while (obj.s>=0 && obj.e>obj.s) { JHTEMP = toNum1(obj.estr, ostr); //检查左括号的外边是否是一个函数名 for (i in fstr) { if (estr.lastIndexOf(fstr[i], obj.s) == obj.s-fstr[i].length) { hasfunc = fstr[i]; break; } } if (hasfunc.length>0) { JHTEMP = func(hasfunc, JHTEMP); estr = estr.slice(0, obj.s-hasfunc.length)+JHTEMP+estr.slice(obj.e+1); hasfunc = ""; } else { JHTEMP = JHTEMP[0]; estr = estr.slice(0, obj.s)+"JHTEMP"+estr.slice(obj.e+1); } obj = godepth(estr); } estr = toNum1(estr, ostr); return estr; } //计算无括号带逗号表达式 function toNum1(estr, ostr) { var i, earray = estr.split(","); for (i in earray) { earray[i] = toNum0(earray[i], ostr); } return earray; } //计算无括号无逗号表达式 function toNum0(estr:String, ostr:String) { var i, maxisp, earray = toArray0(estr, ostr); //搜索数组,找出最高的优先级(非运算符的优先级为0) while (earray.length>1) { maxisp = 0; for (i in ear |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: 创建一个Flash站点的十大技巧下一篇: Flex组件篇:DateChooser
关于继续表达式求值—支持函数的所有评论