用C ++评估数学表达式

时间:2016-09-30 00:23:03

标签: c++ algorithm parsing arithmetic-expressions

在我已经工作了一段时间的编码问题中,我已经迈出了一步,我必须评估一个如下所示的数学表达式:

3 * 2 ^ 3 ^ 2 * 5

并且应该像这样评估:

3 * 2 ^ 3 ^ 2 * 5 = 3 * 2^(3 * 2) * 5 = 3 * 64 * 5 = 960.

在我的实现的当前形式中,我有两个向量,一个包含操作数作为整数,而另一个包含操作符作为字符。

对于目前的情况,它们是:vector<int> operands = { 3, 2, 3, 2, 5 }vector<char> operators = { '*', '^', '^', '*' }

这只是一个示例,操作顺序可能不同,乘法可能并不总是第一个/最后一个操作。

我已经暂时停留在这个特定的步骤,即将两个矢量容器封装的表达式计算为整数。我已经查看了一些我可以在网上找到的数学解析器,但我仍然没有看到如何实施正确的评估。

非常感谢解决方案。

enter image description here

2 个答案:

答案 0 :(得分:1)

expression templates可以实现您的目标。它们使得以非标准顺序和/或行为评估表达式成为可能 - 使用它们,您还可以为表达式中的同一运算符定义多个含义。

答案 1 :(得分:1)

只需在解析表达式时计算值,为最终产品保留一个变量,为当前被乘数保持一个变量(即具有相应基数的当前指数组)。按照您的方式顺序应用每个指数操作数,从而执行左关联取幂。

顺便说一句,我不会以某种矢量化格式存储整个表达式;我认为这样做没有任何有用的理由。