如何在C#中解析字符串并获取公式?

3

可能是重复问题:
使用数学运算符评估C#字符串

假设我有一个基本字符串,其值为“1 * 2 + 4”。

我该如何解析信息并进行计算?

我正在自学C#,但我的假设是这是编程中常见的问题,但如果不使用库,怎么做呢?

到目前为止,我的结果是将字符串拆分并将它们放入字符数组中,但是由于我正在尝试弄清楚如何将字符与运算符和字符与整数进行比较,因此在这里停止了。

我不确定我是否正在正确处理这个问题,但如果有人能指点我正确的方向,那就太好了。

感谢您提前的帮助。


2
你在意运算的顺序吗? - rerun
"不使用库"。为什么有这个限制?你假设这是一个常见的操作,但又不想使用别人已经想出来的方法吗? - Joe White
1
假设您希望4+2*3的结果为10(即乘除法优先于加减法),请查看https://dev59.com/f2455IYBdhLWcg3wAvbQ#4582438或尝试在SO上搜索“equation parser”。 - rajah9
我非常喜欢这种方法,但是还没有时间检查它是否回答了问题。http://social.msdn.microsoft.com/Forums/en-NZ/csharplanguage/thread/31ac96da-415e-424b-9e1f-6aec86c4c3ae - Mike Miller
是的,看起来我要学习逆波兰表达式算法了。这正是我想要解决问题的方法。理解不同的数据结构和算法对我的进步至关重要... :D 谢谢大家。 - Anicho
显示剩余2条评论
3个回答

11
你需要的是 Shunting-yard 算法。你需要至少两个栈;一个用于存储运算符,一个用于存储操作数。当你填充这些栈后,你可以生成 RPN 并计算答案。

+1 最近我也实现了一个非常类似的学校作业(我使用了像&和|这样的运算符词)。我也使用了Shunting yard算法。你会熟悉逆波兰表示法、栈和队列。这是一个不错的练习。 - Pete

3

好的,C#(或其他编程语言)可能会为您提供各种工具来帮助您,但无论使用哪种编程语言,解决问题的整体方法始终保持不变。

因此,是的,您需要将其拆分为运算符和整数。您需要逐个识别字符,但尝试以该语言最有效的方式进行操作。Fosco的答案指向了正确的链接。使用Ncalc库而不是手动操作,可以更加高效。

但是,要完成您开始的工作:

int.Parse(str) 

int.TryParse(str, out num)   

以下是您在C#中将字符转换为整数的函数(您使用split()函数获得的字符)可以考虑的功能。您可以在此处阅读有关它们的信息...(Parse, TryParse

这很有帮助,解析函数让生活变得更容易了.... - Anicho

2
如果您想了解各种现有库是如何实现的,您需要学习解析、词法和语法分析、表达式树、编译器理论等知识。此外,您还可以查看任何一个多个开源库的源代码来了解它们的实现方式。

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