【发布时间】:2015-05-12 08:11:23
【问题描述】:
我遇到了读取包含逻辑语句的输入文件的问题,我需要构建一个真值表来确定 ASK 是否匹配任何/所有已确定的模型。我可能希望读入的一些数据的示例是:
(p & z => x) => ((p | d) & z)
请不要太拘泥于这个例子以及它是否真的有意义,我只是为了展示我可能会看到的不同作品而编造出来。多个这样的语句可以用分号分隔。
我已经整理出没有任何戏剧性的分号拆分,现在有一个包含每个单独语句的字符串向量,其中每个字符串如上所示。现在在不涉及括号的情况下,我相信确定这些陈述将是相当直接的,但在他们的参与下,我现在需要在其他人之前计算不同的部分。例如:
(p | d) = result 然后(result & x)
我看到人们讨论使用堆栈来确定开括号是否正确关闭的概念,但我认为这不适合我的情况,因为这不允许我确定哪些语句在什么集合中的括号。
我目前的想法是使用堆栈的想法,并尝试确定语句的“深度”(基本上是嵌套多远),然后用每个语句标记这个数字,但我相信这听起来像一个不优雅的解决方案。有没有人对我应该如何构建一个算法来正确解决问题有任何提示?
【问题讨论】:
-
您不能为此使用shunting yard algorithm 吗?它应该注意括号和逻辑运算符的不同优先级。
-
@MOehm 我现在就去看看,谢谢你的链接。我很快就会在这里发表评论。
-
你可以构造一棵二叉树
-
到目前为止,Shunting Yard 算法似乎是可行的方法。递归下降解析器看起来很有趣,但可能比我需要的更复杂。二叉树也是表示我发现的数据的一种非常好的方法。我将首先尝试实现 Shutting Yard 算法,看看我能取得什么进展。谢谢大家的建议!
标签: c++ algorithm fileparsing