现在的位置: 首页 > 综合 > 正文

nyoj 305 表达式求值

2014年10月30日 ⁄ 综合 ⁄ 共 3678字 ⁄ 字号 评论关闭

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1. 一个正的十进制数 x 是一个表达式。

2. 如果 和  表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。

3. 如果 和  表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。

4.如果 和  表达式,则 函数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
来源
第四届河南省程序设计大赛

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));
	}
}

抱歉!评论已关闭.