16

假设用户输入一个中缀表达式作为字符串?使用 C 语言评估该表达式的结果可能是最简单的(最简单的意思是shortes t)方法?

可能的方法是将其转换为后缀,然后使用堆栈。但这是一个相当长的过程。是否有任何方法可以使用诸如atoi()eval()之类的函数来简化工作?

4

6 回答 6

5

当然,最有指导意义的方法(甚至可能是最简单的方法,一旦你知道如何)就是学习如何编写自己的递归下降解析器。C 中中缀表达式的解析器不是很长。

这是Eli Bendersky 关于解析的许多优秀博客文章之一。(这是与您最相关的一个,但我强烈推荐所有这些。)它包含中缀表达式解析器的源代码 - 诚然是在 Python 中,而不是 C,但转换应该相当简单,而且你在这个过程中会学到很多东西。

于 2009-07-31T06:51:11.183 回答
5

C 没有内置的“eval”函数,但有提供它的库。

我强烈推荐使用TinyExpr。它是免费的开源 C 代码,可从字符串实现数学评估。TinyExpr 只有 1 个 C 文件,大约 500 行代码。我认为您不会找到一种更短或更简单的方法,它实际上是完整的(而不仅仅是一个玩具示例)。

这是一个使用它的完整示例,它应该展示它是多么容易:

#include "tinyexpr.h"
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%f\n", te_interp("5 * 5", 0)); //Prints 25
    return 0;
}

如果您想自己构建表达式求解器,我建议您将TinyExpr 源代码作为起点。它非常干净且易于遵循。

于 2017-01-24T22:27:14.960 回答
2

你需要解析字符串。C 语言中没有eval()(与大多数静态语言一样),因此您需要编写自己的解析器或查找一些库来提供帮助。

因为大多数易于使用的解析器是用于 C++ 而不是 C,所以我宁愿使用完全可嵌入的语言。我最喜欢的是Lua,如果你不包含库,它可以非常轻量级。此外,语法比 C 更好,因此您的用户可能更喜欢它。

当然,Lua 是一门成熟的编程语言,所以它可能不合适,或者它可能在其他方面有所帮助(以便更容易扩展您的应用程序)。

于 2009-07-30T15:37:42.863 回答
0

一种干净(可能不短)的方法是构建一棵树,就像编译器一样。

例如,假设您有表达式“2+3”。'+' 将是头部。“2”是左孩子,“3”是右孩子。

由于每个表达式的计算结果都是一个值,因此该树可以扩展为无限复杂的表达式:它只需要按照每个运算符的优先顺序进行排序。低优先级运算符(如“+”位于顶部,而高优先级运算符(如“*”)位于底部。然后您将从下向上计算树上的表达式。

于 2009-07-30T15:39:40.753 回答
0

您需要构建一些脚本语言的解释器。

于 2009-07-30T16:35:54.290 回答
0

将字符串转换为标记数组,这些标记是操作数和运算符。将中缀标记数组转换为反向波兰表示法数组。等式在 RPN 中后,您可以将令牌从堆栈中弹出并对其进行操作。

看看关于反向波兰表示法的维基百科文章。它显示了如何进行转换和计算。

于 2009-07-30T19:04:24.210 回答