新手求教!麻烦大触帮我看下代码,多谢~
第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)