2012-04-29 12 views
0

私は抽象データ型を使って以前とは違った式ツリーを評価しています。マップ関数を正確に使う方法がわかりません。std :: mapを使って式ツリーを評価する

わかりましたので、この機能

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

呼び出し、この関数を、この関数の中で、私はこの異なる方法でこの

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); 
} 
のように、私が以前にやった

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()) 
} 

返すことが何かわかりません

+1

質問は何ですか? –

+1

'|'は*ビット単位または*です。あなたはおそらく '||'を意味します。 – Johnsyweb

+0

以前のプログラムで何をしたかに基づいています。どのように私は同じことを実装する代わりに地図のものを使用します。 nodetype = + then evaluate(leftPtr-> ipmap)+ evaluate(rightPtr-> ipmap)を返すとしますか?前のようなもの – user1325578

答えて

1

式の評価にはツリーが必要で、std::mapはツリーを内部で使用しますまあ。それは彼らが自然なマッチであることを意味しません。

特に、std::map<std::string, int>は、各文字列の出現を1つだけ保持でき、それらの文字列によって順序付けられます。式ツリーは、複数の同一の部分式を保持でき、式評価のための算術ルールによって順序付けられます。