2012-04-29 77 views
0

我正在使用抽象數據類型來評估表達式樹,因爲之前以不同的方式oppposed,我不確定如何完全使用map函數。使用std :: map評估表達式樹

好了,所以這個功能

int arithmetic_expression::evaluate_Expression(std::map< std::string, int > ipMap) 
{ 
if (tree != NULL){ 
    return(tree->evaluate(ipMap)); 
} 
else 
    return(0); 
} 

調用此功能,在此功能中我不知道該怎麼回

int Tree::evaluate(std::map< std::string, int > ipMap){ 

//not sure what to put in return to evaluate the expression 
if(NodeType==TYPE_OPERATOR) 
{ 
    return()) 
} 

我以前這樣做不同的方式這樣

int arithmetic_expression::evaluate_Expression() 
{ 
if (topPtr != NULL) 
    return(evaluateTree(topPtr)); 
else 
{ 
    std::cout<< "Invalid expression: returning 0"<< std::endl; 
    return(0); 
} 
} 
} 
} 


int arithmetic_expression::evaluateTree(TreeNodePtr rootPtr) 
{ 
if ((rootPtr->Op=="+") | (rootPtr->Op=="-")|(rootPtr->Op=="*")|(rootPtr->Op== "/")) 
{ 
    if (rootPtr->Op=="+") 
     { 
      return(evaluateTree(rootPtr->leftPtr)+ evaluateTree(rootPtr->rightPtr)); 
     } 
    if (rootPtr->Op=="-") 
    { 
     return(evaluateTree(rootPtr->leftPtr)- evaluateTree(rootPtr->rightPtr)); 
    } 
    if (rootPtr->Op=="*") 
    { 
     return(evaluateTree(rootPtr->leftPtr)* evaluateTree(rootPtr->rightPtr)); 
    } 
    if (rootPtr->Op=="/") 
    { 
     return(evaluateTree(rootPtr->leftPtr)/ evaluateTree(rootPtr->rightPtr)); 
    } 
} 
else 
{ 
    int Number; 
    std::istringstream(rootPtr->Op) >> Number; 
    return(Number); 
} 
+1

問題是什麼? –

+1

'|'是*按位或*。你可能是指'||'。 – Johnsyweb

+0

根據我在之前的程序中做了什麼。我如何實現相同的事情,但使用地圖的東西。如果nodetype = +,然後返回evaluate(leftPtr-> ipmap)+ evaluate(rightPtr-> ipmap)等,我該怎麼辦?有點像前一個 – user1325578

回答

1

你確實需要一棵樹來進行表情評估,並且std::map使用了一棵樹內部LY。這並不意味着它們是天生的匹配。

特別是,一個std::map<std::string, int>只能容納每個字符串的一個出現,並按這些字符串排序。您的表達式樹可以保存多個相同的子表達式,並按照算術規則進行排序以進行表達式評估。