答案 0 :(得分:0)
将整个公式分成直接后代的块应该很容易,而每个块都是格式良好的。使用嵌套级别计数:开括号增加级别,右括号降低级别,每当嵌套级别为0时,块之间就有边界。
这样,你可以转换
((a b) (c d)) e ((f g h) i)
进入其组成部分:
((a b) (c d))
e
((f g h) i)
对于每个部分,如果它包含多个符号,则递归地运行相同的算法。
答案 1 :(得分:0)
当然可以。首先,如果您实现一种语法,其中括号是语法收集标点符号(例如Python列表),您可以使用内置的评估函数将您的输入解析为理想的结构。
失败了...我相信以下只是前一个答案的更详细版本。步骤很简单(递归应该很简单,不是吗?):
对于此列表中的每个元素:
3A。删除最外面的括号;
3B。将括号数减少1;
3c上。重申这个元素。
现在,让我们来看看你给出的例子。我忽略了原始的根节点文本,支持你在树中显示的结构:
[(A ((B C) (D E)))(F G (H I L))]
在每个级别,首先要做的是剥去最外面的括号(实际上是括号,在这种情况下。我不知道你为什么在外面有不同的符号)。
(A ((B C) (D E)))(F G (H I L))
现在,从前面开始,记住你有多少个开括号。
(A ((B C) (D E)))(F G (H I L))
1 23 2 3 2101 2 10
注意:如果你需要为不平衡抛出语法错误,你就有了 不错的检查:最终计数必须为0,没有后续字符。
无论你在中间有一个0,打破字符串(用^标记):
(A ((B C) (D E))) ^ (F G (H I L))
1 23 2 3 210 1 2 10
现在,重复发现您找到的每个元素。如果元素是原子的,那么它就是叶子节点。 如果要保存计数时间,请将计数作为例程的另一个参数。在递归时将它减少1。
^
A ((B C) (D E)) F G (H I L)
12 1 2 10 1 0
左侧有两个元素:叶子节点A和另一个我们重复的表达式:
((B C) (D E))
12 1 2 10
没有内部0,所以我们在整个列表中重复:
(B C) (D E)
1 0 1 0
这分为两个列表,(B C)和(D E)
同样,根节点的右分支分为三个元素: F,G 和(H I L)。以同样的方式处理这些。