2012-04-30 57 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

相關問題