表达式求值:JAVA的递归实现

  • 题目
    在这里插入图片描述
  • 思路
    求值优先级:括号> */ >±
    故可递归从低到高调用,整数可以看作一个单独的括号值
  • 实现
package 蓝桥;
//测试用例(2+3)*(5+7)+9/3 (12+3)/(3+3)
//不能计算负数,除法只取整数位
import java.util.Scanner;

public class InfixExp {
static char[] exp;
static int i=0;
public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	exp=sc.nextLine().toCharArray();//读入一行表达式,将它转化为一个char数组
	System.out.println(sum());
}
static int sum() {//返回+-形式的值,因为优先级最低,所以遇到更高优先级先算高级别
	int result=mass();//读入一个更高优先级形式的值
	boolean more=true;//判断是否还有需要+-的式子
	while(more) {
		char op=exp[i];
		if(op=='+'|op=='-') {
			i++;
			int value=mass();//读入下一个更高优先级式子
			if(op=='+') result+=value;
			else result-=value;
		}
		else more=false;
	}
	return result;
}
static int mass() {//返回*/形式的值,遇到更高优先级(即带括号的),先算带括号的
	int result=expression();//读入括号或一个整数
	while(true) {
		char op=exp[i];
		if(op=='*'|op=='/') {
			i++;
			int value=expression();
			if(op=='*') result*=value;
			else if(op=='/'& value!=0) result/=value;//分母不为0
		}
		else break;
	}
	return result;
}
static int expression() {//返回括号或者整数的值
	int result=0;
	char c=exp[i];
	if(c=='(') {
		i++;
		result=sum();
		if(i<exp.length-1) i++;//当输入的表达式结尾是右括号
	}
	else {
		while(Character.isDigit(c)&i<exp.length) {
			result=10*result+Character.digit(c, 10);//可以计算两位数
			if(i<exp.length-1) {//当输入的表达式结尾是数字
				i++;
				c=exp[i];
			}
			else break;
			
		}
	}
	return result;
	
}
}

  • 测试用例及结果
    在这里插入图片描述在这里插入图片描述
发布了41 篇原创文章 · 获赞 1 · 访问量 1489

猜你喜欢

转载自blog.csdn.net/qq_44467578/article/details/103074165