java中实现数学表达式计算时如果涉及到数学函数是怎么将函数看作一个整体?如何将函数的括号和一般的括号区别开来?如何区别减号和负号?
比如我想计算{3*(2+8)-4}+6-sin(30)
将中缀转换成后缀时,如何知道将sin(30)看作一个整体,即一个操作数,它中不是含有括号吗?
我们不能把它里面的括号看成普通的括号,我们怎样知道当出现s是函数开始,闭括号时函数结束?

解决方案 »

  1.   

    如果你不是想自己编写编译器,而只是简单的计算的话,我建议你用函数来作,比方说
    Math.abs(value)求绝对值,等等的,Math类里面又很多你想要的函数.
      

  2.   

    我就是简单的调用,你可能误解我的意思了!
    比如我想计算:2+(4*6)-abs(-25)
    将中缀变换成后缀时,怎样识别(4*6)中'('是括号,而'abs(-25)'可以看作一个操作数,而不能把它当作一个整体看作函数?
    我的意思就是如何区分这个式子中的括号和函数??
      

  3.   

    那你应该用java的数学函数阿,而不是这么直接的传进一个表达式去,我想他也不会区分的
      

  4.   

    java 有很多库,楼主应该找一找是否有现成的库实现这样的功能。
    推荐:Java Math Expression Parser(http://www.singularsys.com/jep/)
      

  5.   

    数据结构与算法里讲的只是简单的数学运算,这种带有超越函数的的确没有讲到哈,有点意思,我想是不是可以在中缀变后缀过程之中或者之前首先把表达式中的各个元素进行分离,例如3 + sin(60),那么当扫描到s的时候,这里假定s不是变量,那么进入扫描超越函数过程,直接将sin(60)通通取出并运算,并且将计算后的值计入后缀表示法中。
    以上的做法算是比较笨的办法了,代码稍微简单点,缺点是在后缀表示法中缺少了对超越函数的表示。
      

  6.   

    这个可以采用后缀表达式来计算,但是我在实现这个的过程中遇到了问题,比如说sin(30),后缀表达式为30#sin,那样字符sin怎样才能读入成函数名呢?
      

  7.   

    sin(30)是个函数操作,会比算术运算先进行.