将堆栈解析为二叉树?

时间:2010-11-10 22:40:13

标签: c data-structures tree stack

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

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

     *
    / \
   +   /
   /\  /\
  2 4  4 3

请注意,根是*,它是最外面的操作数。但是在我的操作数堆栈上它看起来像这样:

/
*
+

可能会出现(2+4+3)*42*((4+1)/3)等情况。

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

3 个答案:

答案 0 :(得分:3)

将中缀表达式转换为前缀或后缀表示法。如果不这样做,你就无法拥有一个合适的操作员堆栈。

在后缀表示法中,表达式(2+4)*(4/3)看起来像:

2 4 + 4 3 / *

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

答案 1 :(得分:1)

您不能按照它们在表达式中出现的顺序将运算符放在堆栈中。一旦你完成了这项工作,就会失去消除歧义的能力,正如你所确定的那样。

参见例如http://en.wikipedia.org/wiki/Shunting_yard_algorithm用于解析中缀表示法的算法。

答案 2 :(得分:0)

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

An infix to binary-expression-tree parser that usings two stacks

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