当前位置: 首页 > 知识库问答 >
问题:

使用C语言中的树计算Postfix表达式

姬浩渺
2023-03-14

我应该使用表达式树来计算后缀表达式。假设我有一棵这样的树

    -
   / \
  +   *
 / \  / \
a  b  c  d

我首先需要计算b子树并将其结果存储在节点中,然后是c*d,依此类推,直到我将结果存储在根节点中。

我尝试了使用堆栈的递归方法,但那不起作用。伪代码是这样的

  1. 函数评估(节点)
  2. 评估(节点-

然而,这并没有奏效。我还必须在每一步上显示树,以便显示正在减少的节点。我谷歌了很多次,但我找不到所需的答案。任何人请帮助我如何做到这一点。

void expression_tree::evaluate(node *temp)
{
    if(!temp)
    return;
/// stack_postfix obj;
    stack_postfix obj2;
    evaluate(temp->left);
    evaluate(temp->right);
        if(temp->right == NULL && temp->left == NULL)
        {
            obj2.push(temp);
        }
        else
        {
            node * a = obj2.pop();
            node *b = obj2.pop();
            temp->value = a->value + b->value;
            delete a;
            delete b;
        }

}

共有2个答案

浦思源
2023-03-14

你有2个选择:

叶的评估:

1-只需将值推送到堆栈

评估非叶片:

1-左求值,-记住:求值结果添加到堆栈中。

2-评估权,

3-2项,

4-计算,

5-推送结果。

最后,堆栈中有1个项-最后一个结果

编辑:

void expression_tree::evaluate(node *temp, stack& s)
{
   if(!temp)
      return;

   if(temp->left != NULL && temp->right  != NULL){
       //only 1 pointer is illegal!
       evaluate(temp->left);
       evaluate(temp->right);
       node* n2 = s.pop();
       node* n1 = s.pop();
       //in the stack should be only leaves
       temp->value = n1->value + n2->value;//use switch by operator 
       delete temp->left; 
       temp->left = NULL;
       delete temp->right; 
       temp->right=NULL;
   }
   s.push (temp);
}
井礼骞
2023-03-14

您忘记了obj2。推动(温度)-

但是错误比较多,栈需要在函数调用之间共享,所以函数实际上可以处理它

 类似资料:
  • 代码简介:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/infix,并将它们转换为后缀,例如,在从“/x7”转换为“x7/”的代码中,表达式在方法中从“x7/”编辑为“x7/”。这两种方法都很好,在多个示例上进行了测试(没有在这里发布完整的代码和作业,但也不需要它们。所问的问题只是我遇到的一个错误,不要担心,我不是在要求解决我的作业)。还有方法,因为可以有变量,

  • 了解ANTLR最好的方法就是实例。构建一个简单的计算器是个不错的主意。为了使它容易理解且保持简单,我们将只允许基本的算术运算符(加、减、乘、除)、括号表达式、整数和变量。 grammar Calc; prog : stat+ ; stat : expr | ID '=' expr ; expr : expr ('*'|'/') expr

  • 本文向大家介绍C语言中计算二叉树的宽度的两种方式,包括了C语言中计算二叉树的宽度的两种方式的使用技巧和注意事项,需要的朋友参考一下 C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧。 采用递归方式 下面是代码内容: 采用非递归方式 采用非递归方式计算二叉树的宽度需要借助于队列。代码如下: 总结: 不管采用哪种方式,

  • 我对编码相当陌生。我的“count句子”功能有问题。我将字符串与“.”进行比较,"?" , 和数一句话。无论字符串中有多少标点符号,它都只向句子计数器添加一个。我是否使用strcmp错误地获得了我想要的结果?是否有其他方法可以实现这一点?

  • 5. 练习:在C语言中使用正则表达式 POSIX规定了正则表达式的C语言库函数,详见regex(3)。我们已经学习了很多C语言库函数的用法,读者应该具备自己看懂man手册的能力了。本章介绍了正则表达式在grep、sed、awk中的用法,学习要能够举一反三,请读者根据regex(3)自己总结正则表达式在C语言中的用法,写一些简单的程序,例如验证用户输入的IP地址或email地址格式是否正确。

  • 我想用开放计算给定明文的CBC-MAC。我有以下明文(十六进制转储): 如果我使用openssl的命令行功能,我会得到以下解决方案: 目前为止,一切都好。我有一个额外的块,因为第一个块应该是加密的IV。现在最后一行应该是我的CBC-MAC,如果我理解正确的话。接下来,我试图在C中做同样的事情,下面是示例代码: 之后,我解密加密的消息以验证我的代码。我的代码输出非常令人惊讶: 加密的消息与命令行输出