2014-01-28 51 views
0

我正在研究一个计算器,它需要一个表达式,如(5+4),并通过将按钮按下传递给一个数组,然后从数组中的数据构建一个分析树来评估它。Javascript如何评估右括号?

有趣/奇怪的是,我的代码不会将右括号的值推送到数组。这是我的代码,有人可以帮我吗?

console.log activeButton显示被按下的按钮的值,但即使当我将calcArray.push()置于if语句之外,它也不会推送到数组)。

$(document).ready(function(){ 
     var calcArray = new Array(); 

     $("input").click(function(){ 
      var activeButton = this.value; 
      console.log(activeButton); 
      if(!isNaN(activeButton)) 
      { 
       calcArray.push(parseInt(activeButton)); 
       console.log(calcArray); 
      } 
      else if(activeButton === "=") 
      { 
       evaluate(buildTree(calcArray)); 
       calcArray = []; 
      } 
      else 
      { 
       calcArray.push(activeButton); 
      } 
     }); 
    }); 

的BuildTree代码:

function BinaryTree(root) { 
    this.root = root; 
    this.activeNode = root; 
} 

function Node(element){ 
    this.element = element; 
    this.parent; 
    this.rightChild; 
    this.leftChild; 

    this.setLeft = function(node){ 
     this.leftChild = node; 
     node.parent = this; 
    }; 

    this.setRight = function(node){ 
     this.rightChild = node; 
     node.parent = this; 
    }; 
} 


//methods 

var buildTree = function(array) 
{ 
    var tree = new BinaryTree(new Node(null)); 
    for(var i = 0; i < array.length; i++) 
    { 
     var newNode = new Node(array[i]); 
     if(array[i] == "(") 
     { 
      newNode.element = null; 
      tree.activeNode.setLeft(newNode); 
      tree.activeNode = newNode; 
     } 
     else if(array[i] == "+" || array[i] == "-" || array[i] == "/" || array[i] == "*") 
     { 
      tree.activeNode.element = newNode.element; 
      tree.activeNode.setRight(new Node(null)); 
      tree.activeNode = tree.activeNode.rightChild; 
     } 
     else if(array[i] == ")") 
     { 
      if(tree.activeNode.parent == null) 
      { 
      ; 
      } 
      else 
      { 
       tree.activeNode = tree.activeNode.parent; 
       tree.root = tree.activeNode; 
      } 
     } 
     else 
     { 
      tree.activeNode.element = newNode.element; 
      tree.activeNode = tree.activeNode.parent; 
     } 
    } 
    return tree.activeNode; 
} 

var evaluate = function(node){ 
    var newNode1, newNode2; 
    newNode1 = new Node(null); 
    newNode1.parent = node; 
    newNode2 = new Node(null); 
    newNode2.parent = node; 
    if(node.leftChild == null && node.rightChild == null) 
     return node.element; 
    else{ 
     newNode1.element = evaluate(node.leftChild); 
     newNode2.element = evaluate(node.rightChild); 
     if(newNode1.parent.element == "+") 
     { 
      return Number(newNode1.element) + Number(newNode2.element); 
     } 
     if(newNode1.parent.element == "-") 
     { 
      return newNode1.element - newNode2.element; 
     } 
     if(newNode1.parent.element == "*") 
     { 
      return newNode1.element * newNode2.element; 
     } 
     else 
     { 
      return newNode1.element/newNode2.element; 
     } 
    } 
}; 
+2

''''有一个特殊的魔法属性,可以防止它被推入数组中。 – zerkms

+0

你可以发布你的代码的其余部分? –

+1

如果你的'buildTree'函数工作不正常,那么请发布它的源代码(和一些例子参数),而不是调用代码 – Bergi

回答

3

我只是尝试了这一点,用你的代码,它工作得很好传递值作为一个字符串:

function pushButton (value) { 
    var activeButton = value; 
    console.log(activeButton); 
    if(!isNaN(activeButton)) 
    { 
     calcArray.push(parseInt(activeButton)); 
     console.log(calcArray); 
    } 
    else if(activeButton === "=") 
    { 
     evaluate(buildTree(calcArray)); 
     calcArray = []; 
    } 
    else 
    { 
     calcArray.push(activeButton); 
    } 
}; 

你是不是曾经印刷在最后一种情况下(这是正确的paren将去的地方)的阵列,你确定它不在阵列上,你只是没有看到视觉反馈?

如果是这样,我们需要看到更多的代码。尝试并设置一个jsfiddle。

+0

呃,这是一个视觉反馈的问题。今天早上我又试了一遍,效果很好。太多盯着屏幕,没有足够的想法通过我的代码 – user2464083

+0

发生在我们所有人身上。 – Mordred