我现在没有任何代码,但我只是试图处理我将如何执行此算法,而我只需要一些想法。
假设我有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
有什么想法吗?
答案 0 :(得分:0)
此解决方案基于以下假设:每个子表达式都被括号括起来(可能除了整个表达式之外)。它是分流码算法的简化,它可以解析任意算术表达式:
让我们保留一堆标记(表示为字符串)。堆栈最初是空的。我们遍历字符串,对于每个字符,执行以下操作:
如果堆栈上的令牌数不是1,我们需要在算法完成后打印堆栈的内容(它对应于整个表达式没有括号的情况)。
以下是其工作原理的示例:
让字符串为((A+B)*(C+D))
。
我们一直将令牌推到堆栈,直到遇到第一个右括号。此时,堆栈看起来像[(, (, A, +, B
]。我们不断弹出令牌,直到我们点击(
。连接它们之后,我们得到(A+B)
并将其推回堆栈。堆栈的状态现在为[(, (A+B)]
。在那之后,我们推动令牌,直到我们到达下一个)
。堆栈为[(, (A+B), *, (, C, +, D]
。弹出后,新表达式为(C+D)
,堆栈变为[(, (A+B), *, (C+D)]
。最后,我们到达最后)
并弹出所有内容并获得整个表达式。
注意:此解决方案假定在处理输入之前从字符串中删除空格。
顺便说一下,你不能用正则表达式来解决这个问题,因为我们在这个问题中处理的语言并不常见。