我应该使用表达式树来计算后缀表达式。假设我有一棵这样的树
-
/ \
+ *
/ \ / \
a b c d
我首先需要计算b子树并将其结果存储在节点中,然后是c*d,依此类推,直到我将结果存储在根节点中。
我尝试了使用堆栈的递归方法,但那不起作用。伪代码是这样的
然而,这并没有奏效。我还必须在每一步上显示树,以便显示正在减少的节点。我谷歌了很多次,但我找不到所需的答案。任何人请帮助我如何做到这一点。
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个选择:
叶的评估:
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);
}
您忘记了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中做同样的事情,下面是示例代码: 之后,我解密加密的消息以验证我的代码。我的代码输出非常令人惊讶: 加密的消息与命令行输出