jubi_ 2015-05-20 14:15 采纳率: 0%
浏览 4123
已结题

java,目标是控制台实现带括号的加减乘除运算

新手求教!麻烦大触帮我看下代码,多谢~

第4次改(依旧错

package com.calculator;
import java.io.*;
import java.util.regex.*;
public class calculator {
    public static StringBuilder first(StringBuilder s){
        int a,b;
        while(s.indexOf("(")!=-1){
            a=s.lastIndexOf(")");
            b=s.indexOf(")",a);
            s.replace(0,b+1,second(new StringBuilder(s.substring(a+1,b))).toString());
        }
        return s;
    }
    public static StringBuilder second(StringBuilder s){
        Pattern p=Pattern.compile("[-+*/]");
        String[] st=p.split(s.toString());
        char[] stll=new char[s.length()];
        int j=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='*') stll[j++]='*';
            else if(s.charAt(i)=='/') stll[j++]='/';
            else if(s.charAt(i)=='+') stll[j++]='+';
            else if(s.charAt(i)=='-') stll[j++]='-';        
        }
        char[] st1=new char[j];
        System.arraycopy(stll,0,st1,0,j);
        String[] str=new String[st.length];
        int x=0;
        if(st1[0]=='*'){
            str[x]=String.valueOf(Double.parseDouble(st[0])*Double.parseDouble(st[1]));
            st[1]=str[x];
        }
        else if(st1[0]=='/'){
            str[x]=String.valueOf(Double.parseDouble(st[0])/Double.parseDouble(st[1]));
            st[1]=str[x];
        }
        else if(st1[0]=='+'){
            str[x]=st[0];
            str[++x]="+";
            str[++x]=st[1];
        }
        else if(st1[0]=='-'){
            str[x]=st[0];
            str[++x]="-";
            str[++x]=st[1];
        }
        j=2;
        for(int i=1;i<st1.length;i++){
            if(st1[i]=='*'){
                str[++x]=String.valueOf(Double.parseDouble(st[j])*Double.parseDouble(st[++j]));
                st[j]=str[x];
            }else if(st1[i]=='/'){
                str[++x]=String.valueOf(Double.parseDouble(st[j])*Double.parseDouble(st[++j]));
                st[j]=str[x];
            }else if(st1[i]=='+'){
                str[++x]="+";
                str[++x]=st[++j];
            }else if(st1[i]=='-'){
                str[++x]="-";
                str[++x]=st[++j];
            }
        }
        StringBuilder ss=new StringBuilder();
        for(int i=0;i<=x;i++){
            ss.append(str[x]);
        }
        if(ss.indexOf("+")!=-1||ss.indexOf("-")!=-1){
            ss=third(ss);
        }
        return ss;
    }
    public static StringBuilder third(StringBuilder s){
        Pattern p=Pattern.compile("[+-]");
        String[] st=p.split(s.toString());
        int j=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='+'){
                  j++;
                  st[j]=String.valueOf(Double.parseDouble(st[j-1])+Double.parseDouble(st[j]));
            }
            else if(s.charAt(i)=='-'){
                  j++;
                  st[j]=String.valueOf(Double.parseDouble(st[j-1])-Double.parseDouble(st[j]));
            }
        }
        return new StringBuilder(st[j].trim());
      }
     public static void main(String[] args) {
        try {
            BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
            String s=in.readLine();
            StringBuilder ss=new StringBuilder(s);
            if(ss.indexOf("(")!=-1) ss=first(ss);
            else if(ss.indexOf("*")!=-1||ss.indexOf("/")!=-1) ss=second(ss);
            else ss=third(ss);
            System.out.println("="+ss);
     }catch(NumberFormatException e){
         System.err.println("NumberFormatException");
         e.printStackTrace();
     }catch(ArrayIndexOutOfBoundsException e){
         System.err.println("ArrayIndexOutOfBoundsException");
         e.printStackTrace();
     }catch (IOException e) {
         System.err.println("IOException");
         e.printStackTrace();
     }catch(Exception e){
         System.err.println("Exception");
         e.printStackTrace();
     }
  }
}

加减运算没问题,第二优先级1步运算没问题,2步开始出错:
2*2*2

ArrayIndexOutOfBoundsException
java.lang.ArrayIndexOutOfBoundsException: 3
at com.calculator.calculator.second(calculator.java:50)
at com.calculator.calculator.main(calculator.java:94)

(2+3)*2

Exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.AbstractStringBuilder.substring(Unknown Source)
at java.lang.StringBuilder.substring(Unknown Source)
at com.calculator.calculator.first(calculator.java:10)
at com.calculator.calculator.main(calculator.java:93)

  • 写回答

6条回答 默认 最新

  • bdmh 移动开发领域优质创作者 2015-05-20 14:22
    关注

    你可以去了解一下后缀表达式

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大