社区
C#
帖子详情
挺有难度的数学表达式问题。
xiaoqhuang
2006-10-24 03:40:33
如,有一string 型数学表达式:
1+2 和 2+1,按四则运算法则来说是一样的。
我一数组里有很多数学表达式,有些稍复杂点,如:
(3*5+3*3)
(3*3+3*5)
(5*3+3*3)
(3*3+5*3)
或
(5-1/10)*5
5*(5-1/10)
都是一样的
怎么把这些重复的去掉呢?
编译原理里有个逆波兰表示法,如:a+b写成ab+;(a+b)*c写成ab+c*,这个应该会有帮助。
...全文
212
11
打赏
收藏
挺有难度的数学表达式问题。
如,有一string 型数学表达式: 1+2 和 2+1,按四则运算法则来说是一样的。 我一数组里有很多数学表达式,有些稍复杂点,如: (3*5+3*3) (3*3+3*5) (5*3+3*3) (3*3+5*3) 或 (5-1/10)*5 5*(5-1/10) 都是一样的 怎么把这些重复的去掉呢? 编译原理里有个逆波兰表示法,如:a+b写成ab+;(a+b)*c写成ab+c*,这个应该会有帮助。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xiaoqhuang
2006-10-25
打赏
举报
回复
我的办法是比较+和*运算符2边的数,小的放左边
遇到
(1+2)*3
和
3*(1+2)
这样的,先用JS算出()内的值+0.1,再和后面数比较,小的放前面,所有上面只会是3*(1+2)
呵呵,可能还会有些重复的吧,没仔细测过。
livode
2006-10-24
打赏
举报
回复
刚才给的将逆波尔表示式反推得方法可以实现楼主要的,但是效率太差。
如果比较生成的树,应该会好点。
livode
2006-10-24
打赏
举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。
转换树方法参阅任意一本编译原理书籍
========================================
不行的,只有叶结点相同,根节点不同也不行的。
逆波尔表示式就是树的后根遍历得到的结果。
xiaoqhuang
2006-10-24
打赏
举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。
转换树方法参阅任意一本编译原理书籍
=====================================
编译原理忘得差不多了,而且还重修过。
知道编译原理也不知怎么弄到C#里面用。
xiaoqhuang
2006-10-24
打赏
举报
回复
并不是结果一样就要去掉的,只要把能用运算规则替换成相同的表达式去掉。
我现地先用排序,就是左边小于运算符(+、*)右边的数,去掉了一部分。(-、/运算不变)
但还有一部分去不掉。
如:
(1+2)*3
和
3*(1+2)
乘号2边运算的结果都是3
shrinerain
2006-10-24
打赏
举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。
转换树方法参阅任意一本编译原理书籍
myvicy
2006-10-24
打赏
举报
回复
其实可以直接用js计算出这些表达式的值然后再将相同的去掉。
livode
2006-10-24
打赏
举报
回复
我说个思路:
将(3*5+3*3)进行逆波兰表示,即:35*33*+。然后将此逆波兰表达式反推,当遇到+,*时,生成两个表达式。如:35*33*+ ---> 35* + 33* 和 33* + 35*
| |
/ \ / \
3*5+33* 5*3+33* 3*3+35* 3*3+35*
/ \ / \ / \ / \
3*5+3*3 3*5+3*3 5*3+3*3 5*3+3*3 3*3+3*5 3*3+5*3 3*3+3*5 3*3+5*3
然后将表达式进行匹配。
bobo0124
2006-10-24
打赏
举报
回复
订一个规则: 远算符左面的远算数必须小于等于右面的数
myvicy
2006-10-24
打赏
举报
回复
把复杂的表达式帖几个出来看看。
早起晚睡
2006-10-24
打赏
举报
回复
编译原理里有个逆波兰表示法,如:a+b写成ab+;(a+b)*c写成ab+c*就用这个 但是我也不会
UP一下
exprtk:C ++
数学
表达式
解析和评估库
exprtk:C ++
数学
表达式
解析和评估库
c++实现字符串
表达式
求值(逆波兰式)
在程序设计中,可能碰到需要对字符串
数学
表达式
求值的
问题
,常用的方法是解析
表达式
,生成二叉树,然后进行计算。编译器就是使用这种方法来解析程序中的
表达式
的。这种方法实现起来有点
难度
,需要考虑运算符的优先级,括号的配对,堆栈的使用等等。我们正常情况下看到的
数学
表达式
如果用二叉树遍历的话,恰好是中序遍历,故叫做中序
表达式
。除此之外,还有前序
表达式
,后序
表达式
。如:a+b+c(中序),++abc(前序),ab+c+(后序),如果
表达式
含有×,/,()等就更复杂了。 后缀
表达式
也称逆波兰
表达式
因其使
表达式
求值变得轻松,所以被普遍使用。 程序解析字符串
表达式
,将其转换为逆波兰式,然后生成
表达式
二叉树,最后计算
表达式
值。
表达式
计算_离散
数学
课程设计
表达式
的识别与转换,这是当时的离散
数学
课程设计
Java
表达式
求值2.0
有Bug可联系303447589.愿意为你解答,感谢378200809网友的提问,才有这个更新。
编译原理中缀转后缀
表达式
实现中缀转后缀 编译原理的作业 感觉不是很难
C#
110,825
社区成员
642,575
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章