第五题(15分)
题目描述
实验室的王大神设计的机器人“学霸”掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y)也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y)也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y)也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
输入格式
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出格式
输出有N行,每一行对应一个表达式的值。
样例输入
3
add(1,2)
max(1,999)
add(min(1,1000),add(100,99))
样例输出
解题思路:3
999
200
由于存在嵌套语句,可以每算出一层嵌套就将答案与嵌套语句做替换,当最后字符串中只有数字字符时便是最终答案。注意在判断完一层都需要退回开头重新计算。由于求解三个表达式的过程相同,所以该程序存在冗余语句。
java代码:import java.io.*;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String []str = new String[n];
for(int i = 0;i < n;i++) {
str[i] = br.readLine();
}
for(int i = 0; i < n;i++) {
int j = 0,l = 0,r = 0;
StringBuilder builder = null;
while(true) {
int f;
boolean flag = true;
for(f = 0; f < str[i].length() ;f++) {//判断是否还有嵌套语句
if(!Character.isDigit(str[i].charAt(f)))
break;
}
if(f == str[i].length()) {
break;
}
char t = str[i].charAt(j);
if(t == 'a') {
l = j;
j = j + 4;//跳过语句“(add”,正好四个字符
if(!Character.isDigit(str[i].charAt(j))) {//内层有嵌套,重新判断
continue;
}
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {//拼接整数
builder.append(str[i].charAt(j));
j++;
}
int a = Integer.parseInt(builder.toString());
j++;//跳过逗号
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {
builder.append(str[i].charAt(j));
j++;
flag = false;
}
r = j;
if(flag) {//逗号后仍有嵌套
continue;
}
int b = Integer.parseInt(builder.toString());
String sum = a + b + "";
builder = new StringBuilder(str[i]);
builder.delete(l, r + 1);//删除原嵌套语句
builder.insert(l, sum);//换成运算结果
str[i] = builder.toString();
j = 0;//退回开始
}else if(t == 'm' && str[i].charAt(j + 1) == 'a') {
l = j;
j = j + 4;
if(!Character.isDigit(str[i].charAt(j))) {
continue;
}
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {
builder.append(str[i].charAt(j));
j++;
}
int a = Integer.parseInt(builder.toString());
j++;
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {
builder.append(str[i].charAt(j));
j++;
flag = false;
}
r = j;
if(flag) {
continue;
}
int b = Integer.parseInt(builder.toString());
String sum = (a > b ? a : b) + "";
builder = new StringBuilder(str[i]);
builder.delete(l, r + 1);
builder.insert(l, sum);
str[i] = builder.toString();
j = 0;
}else if(t == 'm' && str[i].charAt(j + 1) == 'i') {
l = j;
j = j + 4;
if(!Character.isDigit(str[i].charAt(j))) {
continue;
}
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {
builder.append(str[i].charAt(j));
j++;
}
int a = Integer.parseInt(builder.toString());
j++;
builder = new StringBuilder();
while(Character.isDigit(str[i].charAt(j))) {
builder.append(str[i].charAt(j));
j++;
flag = false;
}
r = j;
if(flag) {
continue;
}
int b = Integer.parseInt(builder.toString());
String sum = (a > b ? b : a) + "";
builder = new StringBuilder(str[i]);
builder.delete(l, r + 1);
builder.insert(l, sum);
str[i] = builder.toString();
j = 0;
}else {
j++;
}
}
}
for(String s : str) {
System.out.println(s);
}
}
}
提交截图:



