表达式求值
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数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
来源
- 第四届河南省程序设计大赛
-
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
AC代码:
import java.util.Scanner;
import java.util.Stack;
public class Main {
private static int partation(String expression) {
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < expression.length(); i++) {
if (expression.charAt(i) == '(') {
stack.push('(');
}
if (expression.charAt(i) == ')') {
stack.pop();
}
if (expression.charAt(i) == ',' && stack.isEmpty()) {
return i;
}
}
return -1;
}
private static int eval(String expression) {
boolean isValue = true;
for (int i = 0; i < expression.length(); i++) {
if (!(expression.charAt(i) >= '0' && expression.charAt(i) <= '9')) {
isValue = false;
break;
}
}
if (isValue) {
return Integer.valueOf(expression);
}
int left = expression.indexOf('(');
int right = expression.length() - 1;
String subExp = expression.substring(left + 1, right);
int index = partation(subExp);
String expLeft = subExp.substring(0, index), expRight = subExp
.substring(index + 1);
if (expression.charAt(1) == 'd') {
return eval(expLeft) + eval(expRight);
} else if (expression.charAt(1) == 'i') {
return Math.min(eval(expLeft), eval(expRight));
} else {
return Math.max(eval(expLeft), eval(expRight));
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int t = cin.nextInt();
while ((t--) > 0) {
String exp = cin.next();
System.out.println(eval(exp));
}
}
}
RuntimeError代码:
import java.util.Scanner;
import java.util.Stack;
public class Main{//RuntimeError -- -- java 2013-08-01 10:47:01
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
while(N-->0){
String s=input.next();
if(s.endsWith(" "))
s=s.substring(0,s.length()-1);
Stack<String> stack1=new Stack<String>();
Stack<Integer> stack2=new Stack<Integer>();
boolean ok=false;
int x=0;
for(int i=0;i<s.length();i++){
char g=s.charAt(i);
if(g>='0'&&g<='9'&&ok){
x=i;
ok=false;
}
else if(g=='a'||g=='m'){
stack1.add(s.substring(i, i+3));
i=i+3;
ok=true;
}
else if(g==','&&ok==false){
stack2.add(Integer.parseInt(s.substring(x,i)));
ok=true;
}
else if(g==')'){
if(ok==false)
stack2.add(Integer.parseInt(s.substring(x,i)));
int a=stack2.pop();
int b=stack2.pop();
if(stack1.peek().equals("add"))
stack2.add(a+b);
else if(stack1.peek().equals("min")){
stack2.add(Math.min(a, b));
}
else{
stack2.add(Math.max(a, b));
}
stack1.pop();
ok=true;
}
}
System.out.println(stack2.pop());
}
}
}
import java.util.Scanner;
import java.util.Stack;
public class Main{//RuntimeError -- -- java 08-01 10:47:01
static Stack<String> stack1;
static Stack<Integer> stack2;
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int N=input.nextInt();
while(N-->0){
String s=input.next();
stack1=new Stack<String>();
stack2=new Stack<Integer>();
F(s);
System.out.println(stack2.pop());
}
}
private static void F(String s) {
if(s.length()<=0)
return;
char g=s.charAt(0);
if(g=='a'||g=='m'){
stack1.add(s.substring(0, 4));
F(s.substring(4));
}
else if(g>='0'&&g<='9'){
int c=0;
for(int i=0;i<s.length();i++){
if(!(s.charAt(i)>='0'&&s.charAt(i)<='9')){
c=i;
break;
}
}
int num=Integer.valueOf(s.substring(0, c));
stack2.add(num);
F(s.substring(c));
}
else if(g==')'){
String str=stack1.pop();
if(str.equals("add(")){
stack2.add(stack2.pop()+stack2.pop());
}
else if(str.equals("min(")){
stack2.add(Math.min(stack2.pop(),stack2.pop()));
}
else{
stack2.add(Math.max(stack2.pop(),stack2.pop()));
}
F(s.substring(1));
}
else if(g==',')
F(s.substring(1));
}
}