发布时间 2023-10-14 12:12:11作者: 爱新觉罗LQ

329. 仿 LISP 运算

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
        String s = in.nextLine().replace("div", "/").replace("mul", "*")
                .replace("add", "+").replace("sub", "-");
        Deque<String> stack = new ArrayDeque<>();
        int res = 0;
        for (int i = 0; i < s.length(); i++) {
            String temp = s.substring(i, i + 1);
            if (!temp.equals(")")){ //  入栈
                stack.push(temp);
                continue;
            }
            StringBuilder sb = new StringBuilder();
            while (!"(".equals(stack.peek())){
                sb.insert(0, stack.pop());
            }
            String[] split = sb.toString().split(" ");
            String slogan = split[0];
            int a = Integer.parseInt(split[1]);
            int b = Integer.parseInt(split[2]);
            if ("/".equals(slogan) && b == 0){
                System.out.println("error");
                return;
            }
            res = cal(slogan, a, b);
            stack.pop();    //  弹出 "("
            stack.push(res + "");
        }
        System.out.println(res);
    }
    public static int cal(String str, int a, int b){
        if ("/".equals(str)){
            if (a / b < 0 && a % b != 0){
                return a / b - 1;
            }
            return a / b;
        }
        if ("-".equals(str)){
            return a - b;
        }
        if ("+".equals(str)){
            return a + b;
        }
        return a * b;
    }
}