2012-04-30 60 views
1

我不知道如何使用map函数来评估我的树表达式。该功能是这样的使用std :: map评估表达式树<std :: string,int>

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{ 
+0

地图中'string'和'int'的作用是什么? – Attila

+0

好吧我试过的是错的。但我只是应该使用映射来查找树表达式中的元素是否为+ - *或/我相信,如果是的话,使用该运算符来评估左边和右边的子树 – user1325578

+0

我仍然看不到你想要如何/需要使用地图...首先:它是从哪个映射映射到什么的?我不是指类似于(A + B-C * D)/ E +(F-3)“”1 +(2 * 3)“的类型(字符串和整数) – Attila

回答

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)对两个结果执行操作,4)返回当前子结果-树。

+0

非常感谢你,但是如果它已经被解析了,并且树已经从其他函数构建了呢? – user1325578

+0

除非您有从字符串中检索已解析树的方式,否则您将需要再次解析它。您可以将所有已解析的树存储在'map '中,然后通过查找正确的字符串来检索树。或者你问'postOrderEvaluate()'? – Attila

+0

只有一个函数来评估表达式树。没有postorderevaluate或inorder评估。我想我只是问如何使用地图来识别+ - * /从数字和变量,并基于它是什么评估左边的树和右边的树的基础上。更新OP显示调用评估函数的函数 – user1325578

相关问题