Java 蓝桥杯 算法训练 表达式计算

资源限制
时间限制: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;
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值