用逆波兰(后缀)表示法编写的算术表达式是数字和代数运算符的有序列表,它们按顺序计算,因为堆栈将处理它们以返回单个数字结果。如果表达式包含 n 个数字,则如果每个数字和每个运算符都用于计算结果,则它必须包含精确的 (n-1) 个代数运算符。此外,表达式中的前两个元素必须是数字,最后一个元素必须是运算符 - 因此序列中唯一可以是数字或运算符的元素是这两个极端之间的元素,即第 3、第 4、第 5等直到最后一个元素,但一个(即元素编号(2n - 2),因为序列中有(2n - 1)个元素。
我想评估这些中间元素的所有可能组合,其中有 (n-2) 个数字和 (n-2) 个运算符。我知道他们有多少:它将是 2(n-2) 选择 (n-2),生成所有这些排列是一项非常简单的任务 - 但一般来说,并非所有排列都会提供可解析的表达式。例如,如果n = 4,则总共有4C2 = 6个排列,前面有两个数字,最后有一个运算符:如果N代表一个数字,O代表一个运算符,它们是NNNNOOO,NNNONOO,NNNOONO,NNONNOO, NNONONO 和 NNOONNO。但是,这六个中的最后一个不会转换为有效的算术表达式,因为在执行第二个操作之后,堆栈已被清除(或者换句话说,在序列的前四个元素中,数字的数量不超过运营商的数量)。如果作为堆栈处理,这个特定示例实际上不会无法交付结果,
我可以轻松地生成中间元素的所有可能排列,然后对它们进行检查以查看哪些产生可解析的序列,但如果可能的话,我更喜欢只生成可解析的序列。任何人都可以指出一个可以做到这一点的算法吗?
我毫不怀疑有一个,而且它可能是众所周知的 - 但我还没有找到一种足够简单的方法来制定问题,使我能够通过搜索引擎对其进行追踪。
非常感谢您的任何建议。