使用 std::map<std::string, int> 计算表达式树

Evaluating expression tree using std::map<std::string, int>

本文关键字:std gt 计算 int 表达式 lt 使用 string map      更新时间:2023-10-16

我不确定如何使用map函数来评估我的树表达式。函数是这样的

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{

根据注释,映射包含表达式,您需要使用该表达式的结果更新关联的值。 为此,您需要先分析字符串并构建表达式树,然后才能对其进行计算。

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)返回当前子树的结果。