关于"给出字符串表达式,自动计算结果"的JAVA源代码 在CSDN找到某位网友提供如下方法:“其实《数据结构》的书里有算法的,就是中缀表达式变后缀表达式的算法,变成后缀表达式后,逐个弹出就可以了。弹出两个变量和一个操作符,调用计算函数计算,等堆栈空时,计算完毕。”本人对《数据结构》不太熟悉,哪位前辈可以根据上面的方法用JAVA将其实现?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://blog.csdn.net/treeroot/archive/2004/12/29/232808.aspx 我上周不是刚公开这个源码的吗?不知道为何csdn又出问题了 先感谢treeroot(根根) 前辈,不过http://blog.csdn.net网站老是报错!!还有别的网址吗?方便的话可以mail一份给我吗?[email protected] 谢谢! http://blog.csdn.net/lxleaves/archive/2005/01/05/240359.aspx老外的东西,比楼上的那个好多了,呵呵 我不同意lxleaves(飘泊的叶子) 的意见,我可以比较一下:1.可读性:我写的那个我觉得可读性比较强,虽然我没有写注视,但是明显可以看出我用的是一个堆栈, lxleaves(飘泊的叶子) 的那个我至今没有看懂.2.性能:虽然lxleaves(飘泊的叶子) 用了StringTokenizer,但是显然StringTokenizer效率不会很高, 这里就忽略不计吧,因为我对int和double是分开处理的,int的性能明显要高一些.3.可扩展性:我一开始就考虑了这个问题,是比较容易扩展的.4.容错性:我一开始就把这个设计到里面,牺牲了一点点性能,能够给出具体的错误信息和错误位置,而且 可以给出修正的提示,这点lxleaves(飘泊的叶子) 的那个有点逊色.5.简洁性:我对int和double分开处理,所以简洁性是不如 lxleaves(飘泊的叶子) 的那个6.合理性:我自己觉得这个应该是一个静态方法,应该和实例是没有关系的,就和Math函数一样只提供 静态方法,我觉得lxleaves(飘泊的叶子) 的那个代码欠妥.虽然有一个代码是我自己写的,但是我也比较客观的评价,因为我写的代码也有一点让我感觉不理想:对堆栈的处理我使用了递归,会出现重复操作比如 (3+4*5)对于这个我的堆栈变化是这样的:a: ( 3 + 4 * 5 这里没法计算,因为可能有一个操作比*的优先级高,当然目前没有b: ( 3 + 4 * 5 ) 这里先把)放进去,马上要拿出来c: ( 3 + 20 ) 这里把)又放回去了,然后递归调用d: ( 23 ) 同上e: 23这样做主要是为了实现容易,而且可读性好一些 老外是按照编译原理中词法分析的方法来写的他在注释中写了他的正则表达式,可以参阅编译原理中的词法分析部分<expr>-><term>{ '+' <term>} | <term>{ '-' <term>} <term>-><fact>{ '*' <fact>} | <fact>{ '/' <fact>} <fact>-><nmeral>| '(' <expr>')' 感谢treeroot(天才--天天被人踩,人才--人人都想踩)的精彩分析与比较,也感谢各位网友的积极发言.关于这个问题我最找到了一个叫JEP的开源项目,它就是基于JAVA的针对字符串表达式进行计算的.应该说非常专业,支持各种常用函数及自定义函数等.建议各位去看看.地址:http://www.singularsys.com/jep/index.html 关于动态代理 取字符串固定位数问题 一道java面试小题 有关垃圾收集机制的问题 怎么生成50到100的随机数 ????????? 怎么关闭网页? 菜鸟提问: 怎样将String转换为int,怎样将int转换为String? 各位大哥快帮帮我呀! 线程控制问题 请教ireport的问题! Java值传递问题
老外的东西,比楼上的那个好多了,呵呵
lxleaves(飘泊的叶子) 的那个我至今没有看懂.
2.性能:虽然lxleaves(飘泊的叶子) 用了StringTokenizer,但是显然StringTokenizer效率不会很高,
这里就忽略不计吧,因为我对int和double是分开处理的,int的性能明显要高一些.
3.可扩展性:我一开始就考虑了这个问题,是比较容易扩展的.
4.容错性:我一开始就把这个设计到里面,牺牲了一点点性能,能够给出具体的错误信息和错误位置,而且
可以给出修正的提示,这点lxleaves(飘泊的叶子) 的那个有点逊色.
5.简洁性:我对int和double分开处理,所以简洁性是不如 lxleaves(飘泊的叶子) 的那个
6.合理性:我自己觉得这个应该是一个静态方法,应该和实例是没有关系的,就和Math函数一样只提供
静态方法,我觉得lxleaves(飘泊的叶子) 的那个代码欠妥.虽然有一个代码是我自己写的,但是我也比较客观的评价,因为我写的代码也有一点让我感觉不理想:
对堆栈的处理我使用了递归,会出现重复操作
比如 (3+4*5)对于这个我的堆栈变化是这样的:
a: ( 3 + 4 * 5 这里没法计算,因为可能有一个操作比*的优先级高,当然目前没有
b: ( 3 + 4 * 5 ) 这里先把)放进去,马上要拿出来
c: ( 3 + 20 ) 这里把)又放回去了,然后递归调用
d: ( 23 ) 同上
e: 23
这样做主要是为了实现容易,而且可读性好一些
他在注释中写了他的正则表达式,可以参阅编译原理中的词法分析部分<expr>-><term>{ '+' <term>} | <term>{ '-' <term>}
<term>-><fact>{ '*' <fact>} | <fact>{ '/' <fact>}
<fact>-><nmeral>| '(' <expr>')'