从文件 D:\1.txt 里面读取一个算术表达式 1+2*3/4-{4+5/3*[6+4]}+3
怎么求出它的结果呀???急急....
谢谢!!!!!!!!!!!!!!

解决方案 »

  1.   

    package p060815;import java.io.*;
    import java.util.*;public class ComputeExpression {
        public ComputeExpression() {
        }
        public static String readFromFile(String filename){
            String rtn=null;
            try{
                BufferedReader in = new BufferedReader( new FileReader(filename));
                rtn=in.readLine();
                in.close();
            }catch(Exception ex){
                ex.printStackTrace();
            }
            return rtn;
        }
        public static String processParentheses(String src){
            src=src.replace('{','(');
            src=src.replace('[','(');
            src=src.replace(']',')');
            src=src.replace('}',')');
            
            return src;
        }
        public static int compute(String exp){
            List<Integer> num=new ArrayList<Integer>();
            List<Character> op=new ArrayList<Character>();
            
            byte[] e=exp.getBytes();
            int pos=0;
            for (int i=0;i<e.length;i++){
                if (e[i]=='('){
                    for (int j=e.length-1;j>i;j--){
                        if (e[j]==')'){
                            num.add(compute(exp.substring(i+1,j)));
                            i=j;
                            pos=-1;
                            break;
                        }
                    }
                } else if(e[i]=='+'||e[i]=='-'||e[i]=='*'||e[i]=='/'){
                    if (pos!=-1){
                        num.add(Integer.parseInt(exp.substring(pos, i).trim()));
                    }
                    op.add((char)e[i]);
                    pos=i+1;
                }
            }
            if (pos<e.length&&pos!=-1){
                num.add(Integer.parseInt(exp.substring(pos,e.length).trim()));
            }
            
            System.out.print(num.get(0));
            for (int i=0;i<op.size();i++){
                System.out.print(op.get(i));
                System.out.print(num.get(i+1));
            }
            for (int i=0;i<op.size();i++){
                if (op.get(i).equals(new Character('*'))){
                    Integer i1=num.get(i);
                    Integer i2=num.get(i+1);
                    num.set(i,i1.intValue()*i2.intValue());
                    num.remove(i+1);
                    op.remove(i);
                    i--;
                } else if (op.get(i).equals(new Character('/'))){
                    Integer i1 = num.get(i);
                    Integer i2 = num.get(i + 1);
                    num.set(i, i1.intValue() / i2.intValue());
                    num.remove(i + 1);
                    op.remove(i);
                    i--;
                }
            }        for (int i=0;i<op.size();i++){
                if (op.get(i).equals(new Character('+'))){
                    Integer i1=num.get(i);
                    Integer i2=num.get(i+1);
                    num.set(i,i1.intValue()+i2.intValue());
                    num.remove(i+1);
                    op.remove(i);
                    i--;
                } else if (op.get(i).equals(new Character('-'))){
                    Integer i1 = num.get(i);
                    Integer i2 = num.get(i + 1);
                    num.set(i, i1.intValue() - i2.intValue());
                    num.remove(i + 1);
                    op.remove(i);
                    i--;
                }
            }
            
            System.out.println("="+num.get(0));
            return num.get(0).intValue();
        }
        
        public static void main(String[] args) {
            String exp=readFromFile("f:\\temp\\1.txt");
            exp=processParentheses(exp);
            System.out.println(exp+"="+compute(exp));
        }
    }
      

  2.   

    sorry,有个地方我疏忽了import java.io.*;
    import java.util.*;public class ComputeExpression {
        public ComputeExpression() {
        }
        public static String readFromFile(String filename){
            String rtn=null;
            try{
                BufferedReader in = new BufferedReader( new FileReader(filename));
                rtn=in.readLine();
                in.close();
            }catch(Exception ex){
                ex.printStackTrace();
            }
            return rtn;
        }
        public static String processParentheses(String src){
            src=src.replace('{','(');
            src=src.replace('[','(');
            src=src.replace(']',')');
            src=src.replace('}',')');        return src;
        }
        public static int compute(String exp){
            List<Integer> num=new ArrayList<Integer>();
            List<Character> op=new ArrayList<Character>();        byte[] e=exp.getBytes();
            int pos=0;
            for (int i=0;i<e.length;i++){
                if (e[i]=='('){
                    int count=0;
                    for (int j=i+1;j<e.length;j++){
                        if (e[j]==')'&&count==0){
                            num.add(compute(exp.substring(i+1,j)));
                            i=j;
                            pos=-1;
                            break;
                        }else if(e[j]==')'){
                            count--;
                        }else if(e[j]=='('){
                            count++;
                        }
                    }
                } else if(e[i]=='+'||e[i]=='-'||e[i]=='*'||e[i]=='/'){
                    if (pos!=-1){
                        num.add(Integer.parseInt(exp.substring(pos, i).trim()));
                    }
                    op.add((char)e[i]);
                    pos=i+1;
                }
            }
            if (pos<e.length&&pos!=-1){
                num.add(Integer.parseInt(exp.substring(pos,e.length).trim()));
            }        System.out.print(num.get(0));
            for (int i=0;i<op.size();i++){
                System.out.print(op.get(i));
                System.out.print(num.get(i+1));
            }
            for (int i=0;i<op.size();i++){
                if (op.get(i).equals(new Character('*'))){
                    Integer i1=num.get(i);
                    Integer i2=num.get(i+1);
                    num.set(i,i1.intValue()*i2.intValue());
                    num.remove(i+1);
                    op.remove(i);
                    i--;
                } else if (op.get(i).equals(new Character('/'))){
                    Integer i1 = num.get(i);
                    Integer i2 = num.get(i + 1);
                    num.set(i, i1.intValue() / i2.intValue());
                    num.remove(i + 1);
                    op.remove(i);
                    i--;
                }
            }        for (int i=0;i<op.size();i++){
                if (op.get(i).equals(new Character('+'))){
                    Integer i1=num.get(i);
                    Integer i2=num.get(i+1);
                    num.set(i,i1.intValue()+i2.intValue());
                    num.remove(i+1);
                    op.remove(i);
                    i--;
                } else if (op.get(i).equals(new Character('-'))){
                    Integer i1 = num.get(i);
                    Integer i2 = num.get(i + 1);
                    num.set(i, i1.intValue() - i2.intValue());
                    num.remove(i + 1);
                    op.remove(i);
                    i--;
                }
            }        System.out.println("="+num.get(0));
            return num.get(0).intValue();
        }    public static void main(String[] args) {
            String exp=readFromFile("f:\\temp\\1.txt");
            exp=processParentheses(exp);
            System.out.println(exp+"="+compute(exp));
        }
    }
      

  3.   

    hehe, hbwhwang 够狠,连程序都写出来了!我光想偷懒的办法了,想着加载个 script 引擎(比如 Rhino),然后让它算  :)
      

  4.   

    maquan('ma:kju) :
    你都穿5个裤衩了,我还不努力,那--
    还有天理吗?还有王法吗?
      

  5.   

    同意maquan('ma:kju), 哈哈, 要是我就用JavaScript的Eval
      

  6.   

    我试过hbwhwang 的代码了,果然好用,效率真高