正在计算表达式C++

Evaluating expression C++

本文关键字:C++ 表达式 计算      更新时间:2023-10-16

我在使用这个没有指针作为参数的求值函数时遇到了一些问题。

以下是类定义:

class ExpressionTree
    {
    private:
        double data;            // Used for leaf nodes only.
        char operation;         // Used for non-leaf nodes only.
        ExpressionTree *left;   // Will be NULL for a leaf.
        ExpressionTree *right;  // Will be NULL for a leaf.
    };

正如您所看到的,表达式树中只有leftright子树的指针。

以下是我对evaluate()函数的尝试(注意没有指针作为参数传递)

double ExpressionTree::evaluate() const {
    if(left != NULL && right != NULL) {
        double val;
        double left_val = left->data;
        double right_val = right->data;
        if(operation == '+') val = left->evaluate() + right->evaluate();
        else if(operation == '*') val = left->evaluate() + right->evaluate();
        else val = this->data;
        return val;
    }
    else {
        return data;
    }
}

当对这个代码运行它时,我会得到一个分段错误:

ExpressionTree buildComplex() {
    double x, y, z;
    cout << "enter three double values, x, then y, then zn";
    cin >> x >> y >> z;
    ExpressionTree ex(x), ey(y), ez(z), e2(2),
        yz = ey * ez,
        y2 = e2 * ey,
        sum1 = ex + yz,
        full = sum1 + y2;
    return full;
}
void test4() {
    cout << "test4: construct and evaluate more complexn";
    ExpressionTree e = buildComplex();
    cout << "x + y * z + 2 * y = " << e.evaluate() << endl;
}

我认为分段错误来自evaluate()函数中的递归调用。

我要问的问题是:在没有节点作为参数传递给函数的情况下,如何递归地评估树?如果根节点下面只有一层,我可以理解,但会有多个层,我不知道如何解决所有其他层。

谢谢!

您在同一个节点上调用evaluate,创建一个无限循环。

如果要在子表达式上调用它,请使用left->evaluate()


可能还有更多的问题,我注意到的是这个问题:

else if(right != NULL)

这毫无意义,仅仅因为left不是NULL,你就要忽略正确的子表达式吗?

您的evaluate()方法是无稽之谈。它应该看起来像这样:

double ExpressionTree::evaluate() const
{
    if (left != NULL && right != NULL)
    {
        switch (operation)
        {
        case '+':
            return left->evaluate()+right->evaluate();
        case '-':
            // remaining operators left as an exercise for the reader
        // ....
        }
    }
    // I'm assuming there are only binary operators,
    // but if you have unary operators, i.e. unary '-', it's a simple
    // extension of what's here
    return data;
}