比如:   3 x 2000 + 6 x 3 + 1 这样类似的四则运算式,式子内容是动态生成的,但是java里面好像没有脚本中eval函数可以求运算结果的。

解决方案 »

  1.   

    hehe,JDK没有现成的。
    不过网上有很多现成的。无非是用一个或者两个Stack来解决。
      

  2.   

    import java.io.*;
    import java.util.*;
    public class Hello
    {
    private static int index=-1;
    public static void main(String [] args)
    {
    System.out.println(jisuan("3*(2+3)/(5)-(1-2)*2"));
    System.out.println(jisuan("3*(2+3)/(5-5)-(1-2)*2"));
    }
    private static double jisuan(String s)
    {
    LinkedList<Token>oper=new LinkedList<Token>();
    oper.addFirst(new Token('#',-1));
    LinkedList<Double>num=new LinkedList<Double>();
    String t="";
    for(int i=0;i<s.length();i++)
    {
    if(s.charAt(i)=='(')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    oper.addFirst(new Token('(',0));
    }
    if(s.charAt(i)==')')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    while(true)
    {
    Token cur=oper.removeFirst();
    if(cur.c=='(')break;
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }
    if(s.charAt(i)=='+')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('+',1);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }
    }
    if(s.charAt(i)=='-')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('-',1);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }}
    if(s.charAt(i)=='*')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('*',2);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }}
    if(s.charAt(i)=='/')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('/',2);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }}
    if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')
    t+=s.charAt(i);}
    if(t.equals("")!=true)
    num.addFirst(new Double(t));
    while(oper.size()>1)
    {
    Token cur=oper.removeFirst();
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    {
    num.addFirst(d1+d2);
    }
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }}return num.getFirst();}
    }
    class Token
    {
    public char c;
    public int level;//运算优先级 :(:0  +:1  -:1 *:2 /:2 ):3
    public Token(char c,int level)
    {
    this.c=c;
    this.level=level;

    public String toString()
    {
    return ""+c+" "+level;
    }
    }
      

  3.   

    to cxydbydyq(紅衣主教)    有就最好了.没有也可以接受
      

  4.   

    java版数据结构  。有意思。。学习ing.....
      

  5.   

    md ,这个 laji 问题 100 多个人问过了,就不能查查历史?
    我服了,问问题的人能不能勤快一点儿?