Оценка дерева выражений с помощью std::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);
}

person user1325578    schedule 29.04.2012    source источник
comment
| - это побитовое или. Вы, вероятно, имели в виду ||.   -  person Johnsyweb    schedule 30.04.2012
comment
на основе того, что я сделал в предыдущей программе. как мне реализовать то же самое, но вместо этого использовать карту. Делать ли я, если nodetype = +, то вернуть оценку (leftPtr-> ipmap) + оценку (rightPtr-> ipmap) и т. Д. И т. Д. вроде как предыдущий   -  person user1325578    schedule 30.04.2012


Ответы (1)


Вам нужно дерево для оценки выражения, и std::map использует дерево внутри. Это не значит, что они естественно подходят друг другу.

В частности, std::map<std::string, int> может содержать только одно вхождение каждой строки и упорядочено по этим строкам. Ваше дерево выражения может содержать несколько идентичных подвыражений и упорядочено по арифметическим правилам для вычисления выражения.

person MSalters    schedule 30.04.2012