蓝桥杯 算法训练 二元函数

问题描述
  令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值。
  只有满足以下要求的表达式才是合法的:
  1.任意整数x是一个合法的表达式;
  2.如果A和B都是合法的表达式,则f(A,B)也是一个合法的表达式。
输入格式
  第一行两个数a和b;
  第二行一个字符串S表示要求的表达式。
输出格式
  一行一个数表示表达式S的值。
样例输入
1 2
f(1,f(1,-1))
样例输出
-1
数据规模和约定
  S的长度不超过50,运算过程中所有变量不会超出int的范围。
import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static int a;
	public static int b;

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		a = s.nextInt();
		b = s.nextInt();
		String str = s.next();

		char chs[] = str.toCharArray();
		Stack stack = new Stack<>();
		boolean flag = true;
		for (int i = 0; i < chs.length; i++) {
			if (chs[i] == '-') {
				flag = false;
			} else if (Character.isDigit(chs[i])) {
				int num = 0;
				for (; i < chs.length && Character.isDigit(chs[i]); i++) {
					num = num * 10 + Integer.parseInt(String.valueOf(chs[i]));
				}
				i--;
				if (flag) {
					stack.push(num);
				} else {
					stack.push(num * (-1));
					flag = true;
				}
			} else if (chs[i] == ')') {
				int y = stack.pop();
				int x = stack.pop();
				int r = f(x, y);
				stack.push(r);
			}

		}
		//// f(2,f(1,f(1,-1)))
		System.out.println(stack.pop());
	}

	private static int f(int x, int y) {
		// TODO 自动生成的方法存根
		return a * x + b * y;
	}
}

 

你可能感兴趣的:(蓝桥杯)