ITPub博客

首页 > > > 不懂就问,关于js四则运算

不懂就问,关于js四则运算

作者:deeply 时间:2019-09-02 15:30:33 0 删除 编辑

实现能够计算算式字符串,不能通过eval,网上找了一个利用二叉树的方式,然后恶补了下二叉树,但是在看下面的代码时依然无法很多困惑,这个二叉树怎么建立起来的?哪里体现了二叉树?望路过的各位大神指点下(尽可能详细些,谢谢)。


function CalcNode(expr){

    var exprArr = expr.split("");
    var length  = exprArr.length;
    var index   = 0;

    this.left = null;
    this.right = null;

    if(length>1){

        for(i=length-1; i>=0; i--){   
            //这个地方的循环的目的是什么?
            //带进算式字符,看了下,是获取加减或乘除的位置

            if(exprArr[i] === "*" || exprArr[i] === "/"){
                index = i;
            }else if(exprArr[i] === "+" || exprArr[i] === "-"){
                index = i;
                break;
            }

        }

        var leftArr = [];
        var rightArr = [];
        for(var i=0; i<index;i++){
         
            leftArr.push(exprArr[i]);
            
        }
        
        for(var i=index+1; i<length; i++){
            rightArr.push(exprArr[i]);
        }
        
       // 这上面的两个for循环根据下标分割算式字符,为什么这么做?
       //它是怎么考虑到先乘除后加减的?
        
        var left = new CalcNode(leftArr.join(""));
        var right = new CalcNode(rightArr.join(""));


        this.left = left;
        this.right = right;
    }

    this.value = exprArr[index]; 

}

CalcNode.prototype.calculate = function(){
    var res = 0;

    if(this.left=== null && this.right === null){
        res = parseInt(this.value);
    }else{

        var leftValue = this.left.calculate();
        var rightValue = this.right.calculate();

        switch(this.value){
            case "*":
                res += leftValue*rightValue;
                break;
            case "/":
                res += leftValue/rightValue;
                break;
            case "+":
                res += leftValue+rightValue;
                break;
            case "-":
                res += leftValue - rightValue;
            default:
                break;
        }
    }

    return res;
}

var cnode = new CalcNode("1+2*3+4");


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1978/viewspace-3156335/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-30

  • 博文量
    215
  • 访问量
    24534