C 将堆栈解析为二叉树?

C 将堆栈解析为二叉树?,c,data-structures,tree,stack,C,Data Structures,Tree,Stack,我正在制作一个程序,任务是将数学表达式(如(2+4)*(4/3)转换为 一个二叉树,然后操纵它 首先,在解析时,我将字符串转换为两个堆栈:操作数和运算符。 我如何确定根应该是什么,因为在我上面的示例中,树应该是这样的: * / \ + / /\ /\ 2 4 4 3 请注意,根是*这是最外层的操作数。但在我的操作数堆栈上,它是这样的: / * + 可能会出现类似于(2+4+3)*4或2*((4+1)/3)的情况 如何确定哪个操作数应该是二叉树的根 不

我正在制作一个程序,任务是将数学表达式(如
(2+4)*(4/3)
转换为 一个二叉树,然后操纵它

首先,在解析时,我将字符串转换为两个堆栈:操作数和运算符。 我如何确定根应该是什么,因为在我上面的示例中,树应该是这样的:

     *
    / \
   +   /
   /\  /\
  2 4  4 3
请注意,根是*这是最外层的操作数。但在我的操作数堆栈上,它是这样的:

/
*
+
可能会出现类似于
(2+4+3)*4
2*((4+1)/3)
的情况


如何确定哪个操作数应该是二叉树的根

不能只按运算符在表达式中出现的顺序在堆栈中放置运算符。一旦你这样做了,你就失去了消除歧义的能力,正如你所确定的那样


例如,有关解析中缀符号的算法,请参阅。

将中缀表达式转换为前缀或后缀符号。如果不这样做,就不可能真正拥有一个合适的操作符堆栈

在后缀表示法中,表达式
(2+4)*(4/3)
如下所示:

2 4 + 4 3 / *

因此,乘法出现在末尾,可以作为根插入到树中。计算后缀表达式对于计算机来说要容易得多,因为不需要分组。

您可以使用堆栈实现中缀到二进制表达式树。这个链接有一个C++实现:


一个用于运算符,另一个用于操作数,它们都派生自一个基节点类。

解析器是否理解优先级规则,或者您是否总是使用括号强制执行优先级规则?我还必须创建一个解析器(到目前为止,我只是让它在操作数和运算符之间排序,并跟踪括号)。但是是的,括号将永远存在(没有优先规则)。可能是重复的啊,谢谢。我忘了我必须把它变成后缀。这将使事情变得容易得多。