主要函数如下:
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;
}
};