-
问题描述
-
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
-
输入格式
-
输入一行,包含一个表达式。
-
输出格式
-
输出这个表达式的值。
-
样例输入
-
1-2+3*(4-5)
-
样例输出
-
-4
-
数据规模和约定
-
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
-
思路
-
按照计算的优先级,先计算括号内,后进行四则运算。
小括号配对一般用栈去实现,递归就是由系统栈实现,所以可以考虑用递归实现,类似栈的效果。
递归找最内层的小括号,依次进行四则运算,依次返回值,最后得到结果
简单的个人思路,有什么更好的算法,欢迎分享 ^_^
import java.util.*;
public class Main {
static char[] c;
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//将表达式分成字符数组
c = s.toCharArray();
int result[] = start(0);
System.out.print(result[1]);
}
public static int[] start(int index){
//将数字和四则运算符依次放入列表
ArrayList<String> list = new ArrayList<String>(100);
//用于记录每一次的数字
String temp = "";
int i=index;
for(;i<c.length;i++){
if(c[i]=='*'||c[i]=='/'||c[i]=='+'||c[i]=='-'){
if(temp!=""){
list.add(temp);
temp = "";
}
list.add(String.valueOf(c[i]));
}else if(c[i]=='('){
//找到括号,进行递归
int t[] = start(i+1);
list.add(String.valueOf(t[1]));
i = t[0];
}else if(c[i]==')')
break;
else{
temp += c[i];
}
}
if(temp!="")
list.add(temp);
//递归返回读取字符数组的位置以及括号内部运算的值
int r[] = new int[2];
r[0] = i;
r[1] = operate(list);
return r;
}
public static int operate(ArrayList<String> list){
//优先运算乘除,用得到的结果代替乘除运算
for(int i=1;i<list.size();i++,i++){
if(list.get(i).equals("*")){
int num = Integer.valueOf(list.get(i-1))*Integer.valueOf(list.get(i+1));
list.set(i-1,String.valueOf(num));
list.remove(i);
list.remove(i);
i=i-2;
}else if(list.get(i).equals("/")) {
int num = Integer.valueOf(list.get(i - 1))/Integer.valueOf(list.get(i + 1));
list.set(i - 1, String.valueOf(num));
list.remove(i);
list.remove(i);
i=i-2;
}
}
//进行加减运算
int result = Integer.valueOf(list.get(0));
for(int i=1;i<list.size();i++,i++){
if(list.get(i).equals("+"))
result += Integer.valueOf(list.get(i+1));
if(list.get(i).equals("-"))
result -= Integer.valueOf(list.get(i+1));
}
return result;
}
}