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

16
假设用户将中缀表达式作为字符串输入?使用C语言计算该表达式的结果最简单的方法是什么?(“最简单”是指最短的方法)
可能的方法是将其转换为后缀表达式,然后使用栈来计算。但这是一个相对较长的过程。是否有使用诸如atoi()或eval()等函数来简化工作的方法?

更改标题大小写 - 请不要将您的标题大写,Biswajyoti Das - Johnno Nolan
1
如果你想要最短的,看这里:https://dev59.com/j3NA5IYBdhLWcg3whuR_#928804 - Dour High Arch
该解决方案不考虑运算符优先级(也称作BODMAS)——这可能并非必需,但我想指出来。 - Martin B
6个回答

6

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源代码入手。它非常简洁易懂,容易跟随。


5

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

这里是Eli Bendersky关于解析的一系列博客文章之一(这篇与你最相关,但我强烈推荐阅读全部)。它包含一个中缀表达式解析器的源代码 - 尽管是在Python中编写的,而不是C,但转换应该相对简单,并且您将在此过程中学到很多。


2
你需要解析字符串。在C中(正如大多数静态语言一样),没有eval()函数,因此你需要编写自己的解析器或者找到某个库来帮助你。
由于大多数易于使用的解析器都是为C++而不是C编写的,我更愿意使用一个完全可嵌入的语言。我最喜欢的是Lua,如果不包括库,它可以非常轻量级。而且,其语法比C更好,所以你的用户可能会更喜欢它。
当然,Lua是一个完整的编程语言,因此可能不适合,或者可能在其他方面有所帮助(使扩展应用程序更容易)。

这是我回答类似问题时提供的代码片段,用Lua实现了表达式求值:https://dev59.com/VUjSa4cB1Zd3GeqPF4Tb#1157717 - RBerteig
如果你只是在评估数学表达式,Lua并不是“轻量级”的!使用专门为此目的制作的库。 - Imbue

0

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

例如,假设您有表达式“2+3”。'+'将成为头部。'2'将成为左子节点,而'3'将成为右子节点。

由于每个表达式都会评估一个值,因此可以针对无限复杂的表达式扩展此树:只需要按每个运算符的优先级排序即可。低优先级运算符(如'+')放在顶部,而高优先级运算符(如'*')放在底部。然后从下往上在树上评估表达式。


0

你需要构建某些脚本语言的解释器。


0

将字符串转换为操作数和运算符的令牌数组。 将中缀令牌数组转换为逆波兰式数组。 在方程式变成逆波兰式后,您可以从堆栈中弹出令牌并对其进行操作。

请参阅维基百科关于逆波兰式的文章。它展示了如何进行转换和计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接