在数据结构中,我按顺序转换并预先将公式转换为树。但是,我对后期订单不太满意。
对于给定的公式x y z + a b - c * / -
我想出了
- / \ * / (divide) / \ / \ x + - c / \ /\ y z a b
在大多数情况下,这似乎很合适,除了左子树中的*是套牌中的小丑。在后期顺序遍历中,最后一个字符是树的顶部节点,其他所有字符都向下分支。现在,我将/和*运算符表示它们应该位于相反的节点上。但是,当遍历树时,除了*之外,所有内容都适合,因为左子树必须处理根之前的节点,然后切换到右子树。
赞赏正确的方向。
答案 0 :(得分:3)
按顺序排列。首先,再次写出整个堆栈:
x y z + a b - c * / -
现在,从左侧开始,查找第一个运算符。将它和前两个操作数替换为堆栈中的一个有序位:
x(y + z)a b - c * / -
继续下一个操作员:
x(y + z)(a-b)c * / -
然后是下一个:
x(y + z)((a-b)* c)/ -
x((y + z)/((a-b)* c)) -
x - ((y + z)/((a-b)* c))
现在,要使它成为一棵树,只需从中间开始(你已经知道它是原始堆栈中的最后一个元素),并从中向外挂起带括号的子表达式。
答案 1 :(得分:0)
实际上,编写一个解析后序表达式的程序要比按顺序解析它的程序更容易,因为你不必检查操作的优先级。
尝试这样:制作一个堆栈,并在找到它们时添加操作数(从左到右)。找到操作时,从堆栈中提取它所需的操作数数量并放回一棵小树。完成后,堆栈中只有一个结果:最终图表。
例如:
x y z + -> x +
/ \
y z