蓝桥杯基础训练 二元函数(JAVA)

问题描述

    令二元函数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

算法思路

    我们可以遍历字符串中的每一个字符,然后取出里面的数字字符,由于最先得到的数字字符是最后使用的因而这个顺序正好是先进后出,所以借助于Stack类,将先得到的数字push进栈,直到遇见第一个“)”这代表已经进入了表达式的最内层所以此时就应该将栈中最上面的两个元素pop出去,然后带入表达式中求和,最后再将结果push进栈,以便进行上一层表达式的计算。

算法实现

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 input = new Scanner(System.in);
        a = input.nextInt();
        b = input.nextInt();
        String str = input.next();

        char chars[] = str.toCharArray();
        Stack<Integer> stack = new Stack<>();//借助栈来保存依次找到的数字字符
        boolean flag = true;
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '-') {
                flag = false;
            } else if (Character.isDigit(chars[i])) {//Character.isDigit()判断字符是否为数字
                int num = 0;
                for (; i < chars.length && Character.isDigit(chars[i]); i++) {
                    num = num * 10 + Integer.parseInt(String.valueOf(chars[i]));//当数字字符连续时,将数字字符拼接成一个完整的数字
                }
                i--;
                if (flag) {
                    stack.push(num);//将num进栈
                } else {
                    stack.push(num * (-1));//将负num进栈
                    flag = true;//将标志位置为true
                }
            } else if (chars[i] == ')') {
                int y = stack.pop();
                int x = stack.pop();
                int r = counts(x, y);
                stack.push(r);
            }

        }
        // f(f(10,20),f(30,40))
        System.out.println(stack.pop());
    }

    //a*x+b*y的值
    public static int counts(int x,int y){
        return a*x + b*y;
    }
}

更多博文欢迎访问我的个人空间

猜你喜欢

转载自www.cnblogs.com/alex-jzw/p/12514722.html