在 C++ 中评估数学表达式

Evaluating a mathematical expression in C++

在我已经研究了一段时间的编码问题中,我已经到了必须计算如下所示的数学表达式的步骤:

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 = { '*', '^', '^', '*' }

这只是一个示例,运算顺序可能有所不同,因为乘法可能并不总是要执行的 first/last 运算。

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

非常感谢一个解决方案。

expression templates 可以满足您的需求。它们使得以非标准顺序评估表达式成为可能 and/or 行为 - 使用它们您还可以为表达式中的同一运算符定义多个含义。

在解析表达式时简单地计算值,为最终乘积维护一个变量,为当前被乘数维护一个变量(即具有相应基数的当前指数组)。如您所见,按顺序应用每个指数操作数,从而执行左关联取幂。

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