蓝桥杯基础训练 二元函数(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;
    }
}
posted @   Alex-jzw  阅读(323)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示