分析:
- 关键在于,如果处理输入的字符串成表达式
- 字符串分三种情况:
- 如果 S 中只包含一个整数,则该整数就是表达式 S 的值;
- 如果 S 中包含 f 函数,则递归计算 f 函数的参数,并将计算结果代入 f 函数中计算;
- 如果 S 中包含括号,则递归计算括号中的表达式,并将计算结果作为新的表达式 S 计算。
- 解析字符串,使用递归方法,从外向内,寻找f()函数的两个参数
package no1_1;
import java.util.*;
public class Main {
static int a, b;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();
scanner.nextLine();
String s = scanner.nextLine();
System.out.println(calculate(s));
}
private static int calculate(String s) {
// 如果表达式 s 中只包含一个整数,则该整数就是表达式 s 的值
if (s.matches("-?\\d+")) {
//使用正则表达式 -?\d+ 来匹配整数。其中 -? 表示可选的负号,\d+ 表示一个或多个数字
return Integer.parseInt(s);
}
// 如果表达式 s 中包含 f 函数,则递归计算 f 函数的参数,并将计算结果代入 f 函数中计算
if (s.startsWith("f(") && s.endsWith(")")) {
int commaIndex = findCommaIndex(s.substring(2, s.length() - 1));//去掉f(),只传送里面的子串
String arg1 = s.substring(2, 2 + commaIndex);//参数一
String arg2 = s.substring(3 + commaIndex, s.length() - 1);//参数二
int x = calculate(arg1);
int y = calculate(arg2);
return a * x + b * y;
}
// 如果表达式 s 中包含括号,则递归计算括号中的表达式,并将计算结果作为新的表达式 S 计算
if (s.startsWith("(") && s.endsWith(")")) {
return calculate(s.substring(1, s.length() - 1));
}
return 0; // 永远不会执行到这里
}
//找到传进来的s的最外层f函数的两个参数的分隔逗号位置
//比如要找f(1,f(1,-1))的两个参数,s为“1,f(1,-1)”,遇到第一个逗号就是了
private static int findCommaIndex(String s) {
int count = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
count++;
} else if (c == ')') {
count--;
} else if (c == ',' && count == 0) {
return i;
}
}
return -1;
}
}