在CSDN找到某位网友提供如下方法:“其实《数据结构》的书里有算法的,就是中缀表达式变后缀表达式的算法,变成后缀表达式后,逐个弹出就可以了。弹出两个变量和一个操作符,调用计算函数计算,等堆栈空时,计算完毕。”本人对《数据结构》不太熟悉,哪位前辈可以根据上面的方法用JAVA将其实现??

解决方案 »

  1.   

    http://blog.csdn.net/treeroot/archive/2004/12/29/232808.aspx
      

  2.   

    我上周不是刚公开这个源码的吗?不知道为何csdn又出问题了
      

  3.   

    先感谢treeroot(根根) 前辈,不过http://blog.csdn.net网站老是报错!!还有别的网址吗?方便的话可以mail一份给我吗?[email protected] 谢谢!
      

  4.   

    http://blog.csdn.net/lxleaves/archive/2005/01/05/240359.aspx
    老外的东西,比楼上的那个好多了,呵呵
      

  5.   

    我不同意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
    这样做主要是为了实现容易,而且可读性好一些
      

  6.   

    老外是按照编译原理中词法分析的方法来写的
    他在注释中写了他的正则表达式,可以参阅编译原理中的词法分析部分<expr>-><term>{ '+' <term>} | <term>{ '-' <term>} 
    <term>-><fact>{ '*' <fact>} | <fact>{ '/' <fact>} 
    <fact>-><nmeral>| '(' <expr>')' 
      

  7.   

    感谢treeroot(天才--天天被人踩,人才--人人都想踩)的精彩分析与比较,也感谢各位网友的积极发言.关于这个问题我最找到了一个叫JEP的开源项目,它就是基于JAVA的针对字符串表达式进行计算的.应该说非常专业,支持各种常用函数及自定义函数等.建议各位去看看.地址:http://www.singularsys.com/jep/index.html