c++ - 如何解析从末尾开始的字符串C++

标签 c++ solver mathematical-expressions

添加了另一个示例。

我有一个数学表达式,例如 cos(pi*cos(pi * sin(pi*y))),我想求解它。

我认为解析它的最佳方法是从字符串末尾开始。

因此,在上面的表达式中:

  1. i = sin(pi*y)
  2. i = cos(pi*i)
  3. i = cos(pi*i)

我将添加另一个表达式作为示例: cos(pi*(平均值(x,x)*y))

应该这样评估:

  1. i = 平均值(x,x)
  2. i = i*y
  3. 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/

相关文章:

python - 在 Sympy 中解决递归问题

python - 如何确定最佳顺序以最大化影响

optimization - 魔方遗传算法求解器?

r - 在表头 R Markdown html 输出中显示带有数学符号的 data.frame

c - 如何将数学表达式转换为C语句?

c++ - 在 Qt 中为形状设置适当的颜色

c++ - 从 C++ 调用 lua 函数时为 "Error in error handling"

c++ - 使用单个 memset 清零多个数组/假设允许内存布局?

algorithm - 卷积的有效方法,如求和评估

c++ - byte[256] 的 Boost::serial_port 和 asio::async_write 超过 200ms