账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    不懂就问,关于js四则运算
    29
    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");
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部