2016-09-30 57 views
0

数学表达式在编码问题我一直在工作了一段时间,我来了一步,我必须评估的数学表达式,看起来像这样:评价在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 = { '*', '^', '^', '*' }

这只是一个示例,操作顺序可能不同,因为乘法可能不总是要执行的第一个/最后一个操作。

我一直在这个特定的步骤停留了一段时间,即评估由两个向量容器封装到一个整数的表达式。我看过一些我可以在网上找到的数学解析器,但我仍然没有看到如何实施正确的评估。

解决方案将非常感谢。

enter image description here

+1

你真的是指'2 ^(3 * 2)'而不是'2 ^(3^2)'? –

+1

不,这实际上是问题强加的表达形式,对此不能做很多。 2^3^2应该被认为是2 ^(3 * 2)= 2^6,更一般地说是y^x1^x2^...^xn = y ^(x1 * x2 * .... * xn)。 – user43389

+0

@ user43389否,2^3^2应评估为2 ^(3^2),= 2^9 = 512,并注意它是右关联的。你写的东西没有意义。 – EJP

回答

1

只需在解析表达式时计算该值,为最终产品维护一个变量,为当前被乘数维护一个变量(即当前的具有相应基数的指数组)。按照您看到的顺序应用每个指数操作数,从而执行左相关指数运算。另外,我不打扰以某种矢量化格式存储整个表达式;我没有看到这样做的有用理由。

+0

这正是我所做的(在思维方面),但我似乎以某种方式干扰了实现(它只适用于给定的测试用例)。很高兴知道这是要走的路,如果你有时间,实施将会非常好。谢谢 – user43389

+0

@ user43389你的实现失败了哪些测试用例?由于整个左结合性问题在原始问题中没有提及,我们只假设这是基于测试用例本身的解决方案所期望的,所以完全有可能*示例测试案件*只是不正确的。 –

+0

不幸的是,测试用例是隐藏的。但根据其他人提交的成功稿件的数量,我认为这个问题确实可行,即使考虑到文字写得不好。 – user43389

1

你想什么是可能的expression templates。它们可以以非标准顺序和/或行为评估表达式 - 使用它们,您还可以在表达式中为同一个运算符定义多个含义。