我正在制作一个程序,负责将数学表达式(例如(2+4)*(4/3)
)转换为
二叉树,然后操纵它。
首先,在解析时,我将字符串转换为两个堆栈,操作数和运算符。 我如何确定root应该是什么,因为在上面的例子中,树应该如下所示:
*
/ \
+ /
/\ /\
2 4 4 3
请注意,根是*,它是最外面的操作数。但是在我的操作数堆栈上它看起来像这样:
/
*
+
可能会出现(2+4+3)*4
或2*((4+1)/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
一个用于运算符,另一个用于操作数,它们都来自基节点类。