2012-04-29 3 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>은 각 문자열을 한 번만 표시 할 수 있으며 이러한 문자열로 정렬됩니다. 표현식 트리는 여러 개의 동일한 하위 표현식을 포함 할 수 있으며 표현식 평가를 위해 산술 규칙에 따라 정렬됩니다.

관련 문제