String str="((((2+3)/1)+5)-2)*((9-5)/2+3)";
如何计算得到((((2+3)/1)+5)-2)*((9-5)/2+3)的值?
就是将字符串解析后计算出对应的数值

解决方案 »

  1.   

    代码太长了LZ我就不贴了 您自己看看吧应该copy下就可以用了http://shirui-java.javaeye.com/blog/317447/** 
    * 测试 
    * @param args 
    */ 
    public static void main(String[] args) { String gs = "if(4 > 3,if( ( 2 - 1 ) /  ( 0.0001 ) * 3 > 3  , ( 2 - ( 2 - 1 ) /  ( 0.0001 ) * 3  ) * 0.8 ,0),  ( 2 + ( 3 - 2 ) /  ( 0.0001 ) *1  )  * 1)"; 
    // 进行四则运算获得结果 
    System.out.println(szys(strCast("3-4*-5+5"))); 
    System.out.println(calculate(strCast("3-4*-5+5"))); 
    // 函数运算结果 
    System.out 
    .println(calculate(strCast("3+abs(mod(4,if(2>3,1,3))-abs(2*4))*5+5"))); System.out.println(calculate(strCast("if(0.0*2>=10.0,0,10.0-0.0*2)"))); System.out.println(calculate(strCast("if(0<2,(10.0-0*5)*0.8,0)"))); System.out.println(calculate(strCast("-10/0"))); } 
      

  2.   

    我自己写了一个,只能算非负整数的程序。由于不能实现负数,注释也没有什么意思了。抛砖看看能不能引来玉:
    //本程序只能计算正整数范围内的加减乘除运算。
    import java.util.*;public class Expression{
    //优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#'
    //0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。
    int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1},
                         {1 , 1 , 0 , 0 , 0 , 1 , 1},
                         {1 , 1 , 1 , 1 , 0 , 1 , 1},
                         {1 , 1 , 1 , 1 , 0 , 1 , 1},
                         {0 , 0 , 0 , 0 , 0 , 2 , 3},
                         {1 , 1 , 1 , 1 , 3 , 1 , 1},
                         {0 , 0 , 0 , 0 , 0 , 3 , 2}};
        char[] operate={'+', '-', '*', '/', '(', ')', '#'};
        String exp=null;
        public Expression(String exp){
         this.exp=exp;
        }
    int getValueInt(){
    Stack<Integer> optr=new Stack<Integer>();
    Stack<Integer> opnd=new Stack<Integer>();
    String expression=exp+"#";          //给表达式加一个运算符,且是一个结束符
    optr.push(6);                     //先把'#'操作符对应的序号入栈。
    int index=0;                      //从0开始扫描表达式字符串。
    //int sign=1;                       //符号,假设为正
    int num=0;
    char c=expression.charAt(index++);
    while(c!='#'||optr.peek()!=6){
    if(indexOperate(c)==-1){
    /*if(c=='-'){
    sign=-1;
    c=expression.charAt(index++);
    }else if(c=='+'){
    c=expression.charAt(index++);
    }*/
    while(c>='0'&&c<='9'){
    num=num*10+c-'0';
    c=expression.charAt(index++);
    System.out.println("num="+num);
    }
    opnd.push(num);
    //sign=1;
    num=0;
    }
    if(indexOperate(c)==-1){
    System.out.println("Expression is Error!");
    System.exit(0);
    }
    switch(precede[optr.peek()][indexOperate(c)]){
    case 0 : 
    optr.push(indexOperate(c));
    c=expression.charAt(index++);
    break;
    case 1 :
    int num2=opnd.pop();
    int opt=optr.pop();
    int num1=opnd.pop();
    opnd.push(binaryOperation(num1,opt,num2));
    System.out.println(binaryOperation(num1,opt,num2));
    break;
    case 2 :
    optr.pop();
    c=expression.charAt(index++);
    break;
    case 3 :
    System.out.println("括号不配对Expression Error!");
    System.exit(0);
    }//switch
    }//while
    return opnd.peek();
    }
    int indexOperate(char c){
    for(int i=0;i<operate.length;i++){
    if(operate[i]==c) return i;
    }
    return -1;
    }
    int binaryOperation(int operand1,int opt,int operand2 ){
    switch(opt){
    case 0:
    return operand1+operand2;
    case 1:
    return operand1-operand2;
    case 2:
    return operand1*operand2;
    case 3:
    return operand1/operand2;
    }
    return 0;
    }
    public static void main(String[] args){
    //Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)");
    Expression e=new Expression("1+5");
    System.out.println(e.getValueInt());
    //System.out.println(e.getValueInt("(5+3)*2"));
    }
    }
      

  3.   

    重贴一次,把我调试的一些语句去掉:
    //本程序只能计算正整数范围内的加减乘除运算。
    import java.util.*;public class Expression{
    //优先级数组,precede[i][j],表示第i个操作符与第j个操作符的优先级,0,1,2,3,4,5,6分别是'+', '-', '*', '/', '(', ')', '#'
    //0表示,第i个操作符优先级小于第j个操作符。1表示大于,2表示相等,3是表示不可能的。
    int precede[][]={{1 , 1 , 0 , 0 , 0 , 1 , 1},
                         {1 , 1 , 0 , 0 , 0 , 1 , 1},
                         {1 , 1 , 1 , 1 , 0 , 1 , 1},
                         {1 , 1 , 1 , 1 , 0 , 1 , 1},
                         {0 , 0 , 0 , 0 , 0 , 2 , 3},
                         {1 , 1 , 1 , 1 , 3 , 1 , 1},
                         {0 , 0 , 0 , 0 , 0 , 3 , 2}};
        char[] operate={'+', '-', '*', '/', '(', ')', '#'};
        String exp=null;
        public Expression(String exp){
         this.exp=exp;
        }
    int getValueInt(){
    Stack<Integer> optr=new Stack<Integer>();
    Stack<Integer> opnd=new Stack<Integer>();
    String expression=exp+"#";          //给表达式加一个运算符,且是一个结束符
    optr.push(6);                     //先把'#'操作符对应的序号入栈。
    int index=0;                      //从0开始扫描表达式字符串。
    //int sign=1;                       //符号,假设为正
    int num=0;
    char c=expression.charAt(index++);
    while(c!='#'||optr.peek()!=6){
    if(indexOperate(c)==-1){
    /*if(c=='-'){
    sign=-1;
    c=expression.charAt(index++);
    }else if(c=='+'){
    c=expression.charAt(index++);
    }*/
    while(c>='0'&&c<='9'){
    num=num*10+c-'0';
    c=expression.charAt(index++);
    }
    opnd.push(num);
    //sign=1;
    num=0;
    }
    if(indexOperate(c)==-1){
    System.out.println("Expression is Error!");
    System.exit(0);
    }
    switch(precede[optr.peek()][indexOperate(c)]){
    case 0 : 
    optr.push(indexOperate(c));
    c=expression.charAt(index++);
    break;
    case 1 :
    int num2=opnd.pop();
    int opt=optr.pop();
    int num1=opnd.pop();
    opnd.push(binaryOperation(num1,opt,num2));
    break;
    case 2 :
    optr.pop();
    c=expression.charAt(index++);
    break;
    case 3 :
    System.out.println("括号不配对Expression Error!");
    System.exit(0);
    }//switch
    }//while
    return opnd.peek();
    }
    int indexOperate(char c){
    for(int i=0;i<operate.length;i++){
    if(operate[i]==c) return i;
    }
    return -1;
    }
    int binaryOperation(int operand1,int opt,int operand2 ){
    switch(opt){
    case 0:
    return operand1+operand2;
    case 1:
    return operand1-operand2;
    case 2:
    return operand1*operand2;
    case 3:
    return operand1/operand2;
    }
    return 0;
    }
    public static void main(String[] args){
    Expression e=new Expression("((((2+3)/1)+5)-2)*((9-5)/2+3)");
    //Expression e=new Expression("1+5");
    System.out.println(e.getValueInt()); }
    }
      

  4.   

    要么自己通过堆栈、逆波兰式等自己实现,要么就使用动态语言工具。比如说:JDK 6 中 JavaScript、开源的 BeanShell 等的 eval 函数,当然了这些函数的实现也是通过编译原理实现的,
    只是做了一些更高层次的封装,让我们直接使用。