资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
蓝桥杯评测50分,还有一组数据不明白错在哪里,求大神告知,谢了
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
StringBuilder s1 = new StringBuilder(str);
s1=sToi(s1);
System.out.println(s1);
}
public static StringBuilder delCal(String st,StringBuilder s) {
int i2=s.indexOf(st);
if(i2==0)
i2=s.indexOf("-",i2+1);
int start=i2-1;
int end=i2+1;
while(start>-1&&s.charAt(start)-'0'>=0)start--;
while(end<s.length()) {
if(i2+1==end&&s.charAt(i2+1)-'0'==-3)
end++;
else if(s.charAt(end)-'0'>=0)
end++;
else
break;
}
int a,b;
String sum1="",sum2="";
for(int x=start+1;x<i2;x++)
sum1=sum1+s.charAt(x);
for(int x=end-1;x>i2;x--)
sum2=s.charAt(x)+sum2;
if(s.indexOf("-")!=0)
a=Integer.parseInt(sum1);
else
a=-Integer.parseInt(sum1);
b=s.charAt(i2+1)-'0';
b=Integer.parseInt(sum2);
int re=Calculator(a,b,st.charAt(0));
if(a<0)
s.replace(start,end,String.valueOf(re));
else if(b<0)
s.replace(start+1,end,String.valueOf(re));
else
s.replace(start+1,end,String.valueOf(re));
return s;
}
public static StringBuilder changStr(StringBuilder s) {
for(int x=0;x<s.length()-1;x++) {
if(s.charAt(x)-'0'==-5&&s.charAt(x+1)-'0'==-3)
s.replace(x, x+2,"-");
else if(s.charAt(x)-'0'==-3&&s.charAt(x+1)-'0'==-5)
s.replace(x, x+2,"-");
else if(s.charAt(x)-'0'==-3&&s.charAt(x+1)-'0'==-3)
s.replace(x, x+2,"+");
else if(s.charAt(x)-'0'==-5&&s.charAt(x+1)-'0'==-5)
s.replace(x, x+2,"+");
}
return s;
}
public static StringBuilder sToi(StringBuilder st) {
int i=0;
while(st.indexOf("(",i)!=-1) {
int s=st.indexOf("(",i);
int count=0;
int e=0;
for(int x=s+1;x<st.length();x++) {
if(String.valueOf(st.charAt(x)).equals("(")) {
count++;
}else if(String.valueOf(st.charAt(x)).equals(")")) {
if(count==0) {
e=x;break;}
count--;
}
}
StringBuilder s2=new StringBuilder(st.substring(s+1,e));
if(s2.length()>2)
s2=sToi(s2);
st=st.replace(s,e+1,s2.toString());
i=st.indexOf("(");
}
int i1=st.indexOf("*");
int i2=st.indexOf("/");
while(i1!=-1||i2!=-1) {
if((i1<i2||i2==-1)&&i1!=-1)
st=delCal("*",st);
else if(i2!=-1)
st=delCal("/",st);
st=changStr(st);
i1=st.indexOf("*");
i2=st.indexOf("/");
}
i1=st.indexOf("+");
i2=st.indexOf("-");
st=changStr(st);
while((i1!=-1||i2!=-1)&&Judge(st,i2)>=1) {
if(i2==0) {
if(Judge(st,i2)==1)
st=delCal("-",st);
else if(Judge(st,i2)==2)
st=delCal("+",st);
}else if((i1<i2||i2==-1)&&i1!=-1) {
st=delCal("+",st);
}else if(i2!=-1)
st=delCal("-",st);
st=changStr(st);
i1=st.indexOf("+");
i2=st.indexOf("-");
}
return st;
}
public static int Judge(StringBuilder s,int i2) {
int f1=s.indexOf("-",i2+1);
int f2=s.indexOf("+");
if(i2==0&&f1!=-1)
return 1;
else if(i2==0&&f2!=-1)
return 2;
else if(i2!=0)
return 3;
else
return 0;
}
public static int Calculator(int a,int b,char c) {
switch(c) {
case '-':
return a-b;
case '+':
return a+b;
case '*':
return a*b;
default:
return a/b;
}
}
}