二进制表达式树求值
Binary Expression Tree Evaluation
我想计算一个二进制表达式树。这是我迄今为止收集的代码。我在评估树时会破坏它的节点。但问题是,在递归过程中,它会寻找它没有的数据。它只是不断返回0。
void calc(bnode *&b)
{
bnode *c;
int m;
switch (b->data.ch)
{
case '+':m=b->lchild->data.in+b->rchild->data.in;
break;
case '-':m=b->rchild->data.in-b->lchild->data.in;
break;
case '*':m=b->lchild->data.in*b->rchild->data.in;
break;
case '/':m=b->lchild->data.in/b->rchild->data.in;
break;
case '%':m=b->lchild->data.in%b->rchild->data.in;
break;
}
c=new(bnode);
c->lchild=NULL;
c->rchild=NULL;
c->tag=1;
c->data.in=m;
b=c;
}
int eval(bnode *b)
{
if (b->tag==1)
return b->data.in;
else
{
if (b->lchild->tag==0)
eval(b->lchild);
if (b->rchild->tag==0)
eval(b->rchild);
if (b->lchild->tag==1&&b->rchild->tag==1)
calc(b);
}
}
我使用的结构是
union un
{
int in;
char ch;
};
struct bnode{
bnode *lchild;
un data;
int tag;
bnode *rchild;
};
函数eval()
已损坏。在"else"分支中,永远不会返回任何值,这是未定义的行为。
[Edit]eval函数应该改成这样。
int eval(bnode *b)
{
if (b->lchild && b->lchild->tag == 0)
eval(b->lchild);
if (b->rchild && b->rchild->tag == 0)
eval(b->rchild);
if (b->lchild && b->rchild && b->lchild->tag == 1 && b->rchild->tag == 1)
calc(b);
if (b->tag == 1)
return b->data.in;
else
throw "Evaluation error";
}
您还存在内存泄漏,因为bnode
对象从未被删除。
相关文章:
- 二进制表达式的操作数无效 - 使用 for 和迭代器
- 二进制表达式 cout 问题的无效操作数
- 二进制表达式的操作数无效?
- 二进制表达式的操作数无效("常量字符*"和"常量字符*")
- 如何修复"二进制表达式的无效操作数"?
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 如何修复此错误:二进制表达式的操作数无效("std::vector<double>"和"double")?
- 如何将无效操作数修复为二进制表达式
- 错误:二进制表达式的操作数无效(映射使用查找函数错误)
- 错误:二进制表达式('float' 和 'float')返回的无效操作数 (x & (1 << 31)) == 0
- 如何将无效操作数修复为带有字符串的二进制表达式?
- 手动将二进制表达式计算为十六进制
- 实现 vector 时二进制表达式的操作数无效
- 提升multi_index示例:错误:二进制表达式的操作数无效
- 无效的操作数到二进制表达式:
- 二进制表达式的操作数无效("无线电设备"和"常量无线电设备")
- “无效的操作数是二进制表达式”当使用自定义结构作为C 中的MAP索引时
- 使用 std::replace C++ 时二进制表达式的操作数无效
- 二进制表达式中的 GCC 常量临时
- 二进制表达式的语义问题无效操作数("双精度"和"双精度")