假设用户输入一个中缀表达式作为字符串?使用 C 语言评估该表达式的结果可能是最简单的(最简单的意思是shortes t)方法?
可能的方法是将其转换为后缀,然后使用堆栈。但这是一个相当长的过程。是否有任何方法可以使用诸如atoi()或eval()之类的函数来简化工作?
假设用户输入一个中缀表达式作为字符串?使用 C 语言评估该表达式的结果可能是最简单的(最简单的意思是shortes t)方法?
可能的方法是将其转换为后缀,然后使用堆栈。但这是一个相当长的过程。是否有任何方法可以使用诸如atoi()或eval()之类的函数来简化工作?
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 源代码作为起点。它非常干净且易于遵循。
你需要解析字符串。C 语言中没有eval()
(与大多数静态语言一样),因此您需要编写自己的解析器或查找一些库来提供帮助。
因为大多数易于使用的解析器是用于 C++ 而不是 C,所以我宁愿使用完全可嵌入的语言。我最喜欢的是Lua,如果你不包含库,它可以非常轻量级。此外,语法比 C 更好,因此您的用户可能更喜欢它。
当然,Lua 是一门成熟的编程语言,所以它可能不合适,或者它可能在其他方面有所帮助(以便更容易扩展您的应用程序)。
一种干净(可能不短)的方法是构建一棵树,就像编译器一样。
例如,假设您有表达式“2+3”。'+' 将是头部。“2”是左孩子,“3”是右孩子。
由于每个表达式的计算结果都是一个值,因此该树可以扩展为无限复杂的表达式:它只需要按照每个运算符的优先顺序进行排序。低优先级运算符(如“+”位于顶部,而高优先级运算符(如“*”)位于底部。然后您将从下向上计算树上的表达式。
您需要构建一些脚本语言的解释器。
将字符串转换为标记数组,这些标记是操作数和运算符。将中缀标记数组转换为反向波兰表示法数组。等式在 RPN 中后,您可以将令牌从堆栈中弹出并对其进行操作。
看看关于反向波兰表示法的维基百科文章。它显示了如何进行转换和计算。