美文网首页
js实现计算有小括号的加减乘除表达式

js实现计算有小括号的加减乘除表达式

作者: 雪雪雪804 | 来源:发表于2018-04-26 15:22 被阅读0次

    主要函数如下:

    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;

    }

    };

    相关文章

      网友评论

          本文标题:js实现计算有小括号的加减乘除表达式

          本文链接:https://www.haomeiwen.com/subject/kxxmlftx.html