添加了另一个示例。
我有一个数学表达式,例如 cos(pi*cos(pi * sin(pi*y))),我想求解它。
我认为解析它的最佳方法是从字符串末尾开始。
因此,在上面的表达式中:
- i = sin(pi*y)
- i = cos(pi*i)
- i = cos(pi*i)
我将添加另一个表达式作为示例: cos(pi*(平均值(x,x)*y))
应该这样评估:
- i = 平均值(x,x)
- i = i*y
- i = cos(pi*i)
你对此有何看法?你能帮我实现代码吗?
提前致谢
最佳答案
I have a mathematical expression such as cos(pi*cos(pi * sin(pi*y))) and I want to solve it.
不,您想要评估它。解决告诉你某件事为真的条件。评估它只会给你一个结果值。
I think the best way to parse it is starting by the end of the string.
解析此类表达式的传统方法是使用递归下降。它更通用并且更容易实现。控制流程如下所示:
cos
(
A ...其中 A =
pi
*
cos
(
B ...其中 B =
pi
*
sin
(
C ...其中C =
pi
*y
现在您可以评估
pi * y
,并返回C 的值
...现在您有了C,您可以计算
pi * sin(C)
并返回B的值p>
...现在您已经有了 B 的值,您可以计算
pi * cos(B)
,将值返回为 A>
...现在您已经有了 A 的值,您可以计算
cos(A)
,就完成了。
这正是 C 表达式 cos(M_PI * cos(M_PI * sin(M_PI * y)))
的工作方式(假设 π 是常见但非标准的常数)。
它是大致从右到左(实际上是从内到外)进行评估的,但仍然是从左到右读取的。为了清楚起见,我们刚刚标记了临时值。
这种控制流通常简单地变成一棵树,例如
[cos of _]
|
[pi * _]
|
[cos of _]
|
[pi * _]
|
[sin of _]
|
[pi * y]
但显然你可以只评估一次结果,除非你需要保存树以供以后使用。 (请注意,这棵不平衡的树仍然是一棵树,只是由于表达式的嵌套方式而退化)。
...What do you think about it?
您的解决方案的问题在于它会因不同的嵌套结构而中断,例如。
cos( sin((pi * x) + y) + sin(y + (pi * x)) )
不能简单地从右到左计算。
Could you help me to implement the code?
将字符串处理(标记化)与解析和评估分开。独立地推理字符串处理和数学要容易得多。
关于c++ - 如何解析从末尾开始的字符串C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34334574/