华为OD机考-仿LISP运算-栈(JAVA 2025B卷)

在这里插入图片描述
在这里插入图片描述

import java.util.*;

public class LispqEvaluator {
    private int index = 0;

    public int evaluate(String expression) {
        index = 0;
        return parseExpression(expression);
    }

    private int parseExpression(String expression) {
        if (expression.charAt(index) != '(') {
            return parseInt(expression);
        }
        index++; // Skip '('
        String op = parseOp(expression);
        int a = parseExpression(expression);
        int b = parseExpression(expression);
        index++; // Skip ')'
        return calculate(op, a, b);
    }

    private String parseOp(String expression) {
        StringBuilder sb = new StringBuilder();
        while (expression.charAt(index) != ' ') {
            sb.append(expression.charAt(index++));
        }
        index++; // Skip ' '
        return sb.toString();
    }

    private int parseInt(String expression) {
        int sign = 1;
        if (expression.charAt(index) == '-') {
            sign = -1;
            index++;
        }
        int num = 0;
        while (index < expression.length() && Character.isDigit(expression.charAt(index))) {
            num = num * 10 + (expression.charAt(index++) - '0');
        }
        if (index < expression.length() && expression.charAt(index) == ' ') {
            index++; // Skip ' '
        }
        return sign * num;
    }

    private int calculate(String op, int a, int b) {
        switch (op) {
            case "add": return a + b;
            case "sub": return a - b;
            case "mul": return a * b;
            case "div": 
                if (b == 0) return 0; // Handle division by zero
                return a / b;
            default: return 0;
        }
    }

    public static void main(String[] args) {
        LispqEvaluator evaluator = new LispqEvaluator();
        System.out.println(evaluator.evaluate("(mul 3 -7)")); // -21
        System.out.println(evaluator.evaluate("(add 1 2)")); // 3
        System.out.println(evaluator.evaluate("(sub (mul 2 4) (div 9 3))")); // 5
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值