0

以前は別の方法とは反対に式ツリーを評価するために抽象データ型を使用していますが、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);
}
4

1 に答える 1

1

式の評価にツリーが必要であり、std::map内部でツリーを使用します。それは、それらが自然に一致するという意味ではありません。

特に、 astd::map<std::string, int>は各文字列の 1 つのオカレンスのみを保持でき、それらの文字列によって順序付けられます。式ツリーは複数の同一の部分式を保持でき、式評価の算術規則によって順序付けられます。

于 2012-04-30T00:35:38.160 に答える