js实现计算有小括号的加减乘除表达式 |
您所在的位置:网站首页 › js加减乘除括号计算器怎么用的 › js实现计算有小括号的加减乘除表达式 |
主要函数如下: 1.匹配最内括号 2.只含加减乘除的表达式计算(通过两个数组分别保存数字和符号进行进出栈操作实现*/优先) 3.两个数字和一个运算符的计算 //匹配括号,计算括号内只含加减乘除的表达式 //接受一个表达式 function complexEval(str) { if (str == null) { return ""; } if (typeof str != "string") { //转化成字符串 str = str + ""; } var regMatch = /\([^\(\)]+\)/g; var multObj = str.match(regMatch);//匹配括号 while (null != multObj) { var content = multObj[0] +""; var result = simpleEval(content.substr(1,content.length-2)); str = str.replace(multObj[0],result); multObj = str.match(regMatch); } return simpleEval(str); }; //只有加减乘除表达式的计算 //接受不含括号的的表达式 function simpleEval(str) { if (str == null) { return ""; } if (typeof str != "string") {//转化成字符串 str = str + "" } var valueArray =[];//值的数组 var markArray = [];//符号的数组 var tempValue = ""; var ch = str.split(""); var isOper = false; for(var i=0; i< ch.length; i++){ if( ch[i] == "+" || ch[i] == "-" || ch[i] == "*" || ch[i] == "/") { var dv = tempValue*1; if(isOper){ var value = valueArray.pop(); var mark = markArray.pop(); dv = simpleTwoEval(mark, value, dv); } valueArray.push(dv); markArray.push(ch[i]); tempValue = ""; isOper = false; if( ch[i] == "*" || ch[i] == "/" ) isOper = true; }else{ tempValue += ch[i] + ""; if(i == ch.length -1){//最后一位 var dv = tempValue*1; if(isOper){ var value = valueArray.pop(); var mark = markArray.pop(); var dv = simpleTwoEval(mark, value, dv); } valueArray.push(dv); } } } valueArray.reverse(); markArray.reverse(); while(valueArray.length > 1){ var v1 = valueArray.pop(); var v2 = valueArray.pop(); var mark = markArray.pop(); valueArray.push(simpleTwoEval(mark, v1, v2)); } return valueArray[0]; }; //两个数的加减乘除 //接受运算符号和两个数值 function simpleTwoEval(mark,value1,value2){ switch(mark){ case "+": return value1 + value2; case "-": return value1 - value2; case "*": return value1 * value2; case "/": return value1 / value2; default: return 0; } }; |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |