使用堆栈获取逻辑Subexpressions

时间:2016-11-17 18:11:30

标签: java algorithm stack logic expression

我现在没有任何代码,但我只是试图处理我将如何执行此算法,而我只需要一些想法。

假设我有String例如:

((A+B)*(C+B)) * (A+C)

我根本不想使用正则表达式,但我试图通过严格的堆栈操作来弄清楚如何做到这一点。我在考虑计算括号但我必须考虑双内括号。我完全失去了其他想法。

因此对于这个字符串,我只想派生以下内容:

A+B
C+B
(A+B)*(C+B)
A+C
((A+B)*(C+B)) * (A+C)      // The original String

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

此解决方案基于以下假设:每个子表达式都被括号括起来(可能除了整个表达式之外)。它是分流码算法的简化,它可以解析任意算术表达式:

让我们保留一堆标记(表示为字符串)。堆栈最初是空的。我们遍历字符串,对于每个字符,执行以下操作:

  1. 如果它是一个右括号,请保持弹出堆栈的标记,直到找到一个左括号。连接所有弹出的标记(包括括号),打印结果并将其推回堆栈。
  2. 否则只需将令牌推送到堆栈。
  3. 如果堆栈上的令牌数不是1,我们需要在算法完成后打印堆栈的内容(它对应于整个表达式没有括号的情况)。

    以下是其工作原理的示例:

    让字符串为((A+B)*(C+D))

    我们一直将令牌推到堆栈,直到遇到第一个右括号。此时,堆栈看起来像[(, (, A, +, B]。我们不断弹出令牌,直到我们点击(。连接它们之后,我们得到(A+B)并将其推回堆栈。堆栈的状态现在为[(, (A+B)]。在那之后,我们推动令牌,直到我们到达下一个)。堆栈为[(, (A+B), *, (, C, +, D]。弹出后,新表达式为(C+D),堆栈变为[(, (A+B), *, (C+D)]。最后,我们到达最后)并弹出所有内容并获得整个表达式。

    注意:此解决方案假定在处理输入之前从字符串中删除空格。

    顺便说一下,你不能用正则表达式来解决这个问题,因为我们在这个问题中处理的语言并不常见。