使用C语言计算中缀表达式的最简单方法是什么?

时间:2009-07-30 15:08:08

标签: c expression math evaluate infix-notation

假设用户输入中缀表达式作为字符串? 什么是最简单的(最简单,我的意思是短缺 t)使用C语言评估该表达式的结果的方法?

可能的方法是将其转换为后缀然后使用stacks.But它相当长的过程。 有没有办法使用 atoi() eval() 等功能,可以让工作更轻松?

7 个答案:

答案 0 :(得分:5)

当然,最有教育意义的方式(一旦你知道如何,最简单的方法)就是学习如何编写自己的recursive descent parser。 C中的中缀表达式解析器不是很长。

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

答案 1 :(得分:4)

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

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

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

$items.items

如果您想自己构建表达式求解器,我建议您将TinyExpr source-code作为起点。它非常干净,易于理解。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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

例如,假设你有“2 + 3”这个词。 '+'将成为头脑。 '2'将是左孩子,'3'将是正确的孩子。

由于每个表达式求值为一个值,因此可以为无限复杂的表达式扩展此树:它只需按每个运算符的优先顺序排序。低优先级运算符(如'+'位于顶部,而高优先级运算符(如'*')位于底部。然后,您将从下往上评估树中的表达式。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

查看关于Reverse Polish Notation的维基百科文章。它显示了如何进行转换和计算。

答案 6 :(得分:-1)

最简单的,你的意思是最短的,你的意思是最快的代码吗?如果是这样,构建一个字符串并通过popen或类似方法将其传递给另一个进程。如果你不想要一个外部进程,可以像Javier建议的那样嵌入一个lua解释器。给哈维尔+1,这可能是你想要的。