假设用户将中缀表达式作为字符串输入?使用C语言计算该表达式的结果最简单的方法是什么?(“最简单”是指最短的方法)
可能的方法是将其转换为后缀表达式,然后使用栈来计算。但这是一个相对较长的过程。是否有使用诸如atoi()或eval()等函数来简化工作的方法?
可能的方法是将其转换为后缀表达式,然后使用栈来计算。但这是一个相对较长的过程。是否有使用诸如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源代码入手。它非常简洁易懂,容易跟随。
eval()
函数,因此你需要编写自己的解析器或者找到某个库来帮助你。一种简洁(可能不是很短)的方法是构建一棵树,就像编译器一样。
例如,假设您有表达式“2+3”。'+'将成为头部。'2'将成为左子节点,而'3'将成为右子节点。
由于每个表达式都会评估一个值,因此可以针对无限复杂的表达式扩展此树:只需要按每个运算符的优先级排序即可。低优先级运算符(如'+')放在顶部,而高优先级运算符(如'*')放在底部。然后从下往上在树上评估表达式。
你需要构建某些脚本语言的解释器。
将字符串转换为操作数和运算符的令牌数组。 将中缀令牌数组转换为逆波兰式数组。 在方程式变成逆波兰式后,您可以从堆栈中弹出令牌并对其进行操作。
请参阅维基百科关于逆波兰式的文章。它展示了如何进行转换和计算。