1

map 関数を使用してツリー式を評価する方法がわかりません。関数は次のようになります

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

私の先生は、例として印刷をポストオーダーする関数を見るヒントをくれましたが、これがどのように適用されるかわかりません。ここにあります:

void Tree::postOrderPrint(){
if(NodeType==TYPE_OPERATOR)
{
    leftPtr->postOrderPrint();
    rightPtr->postOrderPrint();
    std::cout<< Op << "  " ;
}
else
{
    std::cout<< Op << "  " ;
}

}

ツリーがすでに構築されていて、前の関数から解析された文字列であり、実際にこの関数が行うすべてのことは、次の関数と同等のものである場合はどうなりますか?

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 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){


std::map<std::string, int >::iterator myIter;
myIter=ipMap.find(Op);


{
    if (myIter=="+")
    {
    return(evaluate(leftPtr)+ evaluate(rightPtr))

    }
    if (myIter=="-")
    {
    return(evaluate(leftPtr)- evaluate(rightPtr));
    }
    if (myIter=="*")
    {
    return(evaluate(leftPtr)* evaluate(rightPtr));
    }
    if (myIter=="/")
    {
    return(evaluate(leftPtr)/ evaluate(rightPtr));
    }
    }
    else{
4

1 に答える 1

0

コメントに基づいて、マップは式を保持しており、関連付けられた値をその式の結果で更新する必要があります。これを実現するには、文字列を解析し、評価する前に式ツリーを構築する必要があります。

int Tree::evaluate(std::map< std::string, int > ipMap){
  std::map< std::string, int >::iterator it;
  for (it=ipMap.begin(); it != ipMap.end(); ++it) {
    Tree tree;
    tree.parse(it->first);
    *it = tree.postOrderEvaluate();
  }
}

関数内の特定のツリーに関連付けられていないためevaluate、静的メンバー関数 (またはフリー関数) である可能性があります。

int Tree:postOrderEvaluate()Tree:postOrderPrint()1) 左のサブツリーを評価し、2) 右のサブツリーを評価し、3) 2 つの結果に対して操作を実行し、4) 現在のサブツリーの結果を返します。

于 2012-04-30T18:38:05.217 に答える