【问题标题】:Using a stack to build an expression tree使用栈构建表达式树
【发布时间】:2016-05-02 11:28:12
【问题描述】:

我正在尝试编写一个表达式树函数,该函数接受一个字符数组表达式并输出前缀、中缀和后缀版本。我已经编写了这段代码,它不会抛出任何错误,但是在运行计算值时不会打印出来。我试图调试该功能,但仍然无法提出解决方案。有没有人能给我关于我做错了什么的提示?

void Expression_Tree::build_expression_tree(char input[], int size)
{
    ETNode *temp, *t1, *t2;

    for (int i = 0; i < size; i++)
    {
        if(!(i == '+' || i == '-' || i == '*' || i == '/' || i == '^')) {
            temp = new ETNode;
            temp->left = temp->right = NULL;
            temp->input = i;

            tree_stack.push(temp);
        }
        else {
            temp = new ETNode;
            temp->left = temp->right = NULL;
            temp->input = i;

            t1 = tree_stack.top();
            tree_stack.pop();
            t2 = tree_stack.top();
            tree_stack.pop();

            temp->right = t1;
            temp->left = t2;

            tree_stack.push(temp);
        }
    }

    temp = tree_stack.top();
    tree_stack.pop();
}

我刚刚包含了 build_expression_tree 函数,如果这没有任何问题,那么它一定不能正确链接到我的 inorder、preorder 和 postorder 函数。谢谢!

【问题讨论】:

  • C++ 中的常规方式是使用构造函数来初始化成员(这里:ETNode),而不是让用户代码进行初始化。
  • @stefaanv 我也有一个 ETNode 类
  • 那么,为什么要在用户代码中设置左右指针为NULL呢?
  • @stefaanv 将输入读入新节点?
  • 好吧,我可能有点太直率了,但是看了你的回复,我假设你不知道构造函数是什么,所以你不知道我在说什么。很公平。

标签: c++ stack expression-trees


【解决方案1】:

这可能是一个复制粘贴错误,但您使用i 就好像它是char

我猜你想改用input[i],至少在你的if 语句中。

【讨论】:

  • 我确实尝试过,但它引发了分段错误
  • @user6276841:那么也许你应该检查你传递给函数的内容。
  • 这是我正在传递的测试器文件中的相关代码:char input[] = {'2', '+', '(', '3', '*', '(', '2', '+', '2', ')', ')', '+', '5'}; int size = sizeof(input)/sizeof(char); Expression_Tree a; a.build_expression_tree(input, size);
  • @user6276841 我认为sizeof(input) 为您提供了input 的元素数量,因此您不必除以sizeof(char)。请检查size 的值是否正确?如果不是这样,你能找到段错误的确切行吗?如果无法调试,请添加一些 printf 以查看代码的去向。
  • @Gwen 我试图调试,但调试器只是抛出了大量我以前从未收到过的“多重定义”错误。
猜你喜欢
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多