首页 > 试题广场 >

四则运算

[编程题]四则运算
  • 热度指数:122401 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

数据范围:表达式计算结果和过程中满足 ,字符串长度满足


输入描述:

输入一个算术表达式



输出描述:

得到计算结果

示例1

输入

3+2*{1+2*[-4/(8-6)+7]}

输出

25
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    // 存放算数优先级
    public static HashMap<Character, Integer> map = new
    HashMap<Character, Integer>() { //这里泛型必须写
        // 声明优先级
        {
            put('-', 1);
            put('+', 1);
            put('*', 2);
            put('/', 2);
        }
    };

    public static boolean isNumber(char c) {
        return Character.isDigit(c);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        System.out.println(calculate(str));
    }

    public static int calculate(String str) {

        // 处理特殊括号,注意替换后的值,不要写错了。且replace后要重新赋值给str
        str = str.replaceAll("\\[", "(").replaceAll("\\{", "(").replaceAll("\\]",
                ")").replaceAll("\\}", ")").replaceAll(" ", "");

        // 处理负数
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '-') {
                if (i == 0 || str.charAt(i - 1) == '+' || str.charAt(i - 1) == '-' ||
                        str.charAt(i - 1) == '*' || str.charAt(i - 1) == '/' ||
                        str.charAt(i - 1) == '(')
                    str = str.substring(0, i) + "#" + str.substring(i + 1);

            }
        }

        //初始化两个栈,分别存放运算术和运算符
        Stack<Integer> nums = new Stack<>();
        Stack<Character> opts = new Stack<>();
        char[] cs = str.toCharArray();
        int n = cs.length;
        for (int i = 0; i < n; i++) {
            char c = cs[i];

            //判断负数、左括号、右括号、普通运算数、+-*/
            if (c == '#') {
                int j = i + 1, v =
                            0; // 运算符往后一位,所以是i+1,正数会直接是j=i
                while (j < n && isNumber(cs[j])) {
                    v = v * 10 + cs[j++] - '0';
                }
                nums.add(-v);
                i = j - 1; //多位数处理
            } else if (c == '(') {
                opts.add(c);
            } else if (c == ')') {
                // 计算括号内的数据,直到栈顶为(为止
                while (opts.peek() != '(') {
                    cal(nums, opts);
                }
                opts.pop(); //左括号出栈
            } else {

                // 正数
                if (isNumber(c)) {
                    int j = i, v = 0;
                    while (j < n && isNumber(cs[j])) {
                        v = v * 10 + cs[j++] - '0';
                    }
                    nums.add(v);
                    i = j - 1;
                } else {
                    while(!opts.isEmpty() && opts.peek() != '('){
                        char prev = opts.peek();
                        if(map.get(prev) >= map.get(c)){
                            cal(nums,opts);
                        }else{
                            break;
                        }
                    }
                    opts.add(c);
                    
            }
        
        }
        }

        while (!opts.isEmpty()) {
            cal(nums, opts);
        }

        return nums.peek();

    }

    public static void cal(Stack<Integer> nums, Stack<Character> opts) {
        if (nums.isEmpty() || nums.size() < 2) {
            return;
        }

        if (opts.isEmpty()) {
            return;
        }

        int b = nums.pop(), a = nums.pop();
        char op = opts.pop();
        int ans = 0;
        switch (op) {
            case '+' :
                ans = a + b;
                break;
            case '-':
                ans = a - b;
                break;
            case '*':
                ans = a * b;
                break;
            case '/':
                ans = a / b;
                break;
            default:
                break;
        }
        nums.add(ans);
    }

}

编辑于 2024-04-01 22:46:01 回复(0)
import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
import java.text.DecimalFormat;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static Map<Character, Integer> ***bsp;= new HashMap<>();

    public static void main(String[] args) {
        por.put('+', 0);
        por.put('-', 0);
        por.put('*', 1);
        por.put('/', 1);
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String str = sc.nextLine().trim().replace("{", "(").replace("}", ")")
                    .replace("[", "(").replace("]", ")");
            if (str.startsWith("-")) {
                str = "0" + str;
            }
            StringBuilder sb0 = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if (i > 0 && str.charAt(i) == '-' && str.charAt(i - 1) == '(') {
                    sb0.append("0");
                }
                sb0.append(str.charAt(i));
            }
            str = sb0.toString();
//            System.out.println(str);
            Stack<Character> stack = new Stack<>();
            List<String> list = new ArrayList<>();
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                switch (c) {
                    case '+':
                    case '-':
                    case '*':
                    case '/':
                        while (stack.size() > 0 && stack.peek() != '(' && por.get(c) <= por.get(stack.peek())) {
                            list.add(stack.pop() + "");
                        }
                        stack.push(c);
                        break;
                    case '(':
                        stack.push(c);
                        break;
                    case ')':
                        while (stack.size() > 0) {
                            Character pop = stack.pop();
                            if (pop != '(') {
                                list.add(pop + "");
                            } else {
                                break;
                            }
                        }
                        break;
                    default:
                        String num = c + "";
                        while (i < str.length() - 1 && str.charAt(i + 1) >= '0' && str.charAt(i + 1) <= '9') {
                            num += str.charAt(i + 1);
                            i++;
                        }
                        list.add(num);
                }
            }
            while (stack.size() > 0) {
                list.add(stack.pop() + "");
            }
            double res = calc(list.toArray(new String[]{}));
            DecimalFormat df = new DecimalFormat("0.################");
            System.out.println(df.format(res));
        }
    }

    private static double calc(String[] pattern) {
        for (int i = pattern.length - 1; i >= 0; i--) {
            String s = pattern[i];
            if (s.length() == 1 && por.containsKey(s.charAt(0)) && i > 1 && isNum(pattern[i - 1]) && isNum(pattern[i - 2])) {
                double v1 = Double.parseDouble(pattern[i - 1]);
                double v2 = Double.parseDouble(pattern[i - 2]);
                double res = getRes(s, v1, v2);
                pattern[i] = "null";
                pattern[i - 2] = res + "";
                pattern[i - 1] = "null";
            }
        }
        String[] arr = Arrays.stream(pattern).filter(s -> !s.equals("null")).collect(Collectors.toList()).toArray(new String[]{});
        if(arr.length==1){
            return Double.parseDouble(arr[0]);
        }
        if (arr.length == 3) {
            double r = getRes(arr[arr.length - 1], Double.parseDouble(arr[1]), Double.parseDouble(arr[0]));
            return r;
        }
        return calc(arr);
    }

    private static double getRes(String op, double v1, double v2) {
        double res;
        switch (op) {
            case "+":
                res = v2 + v1;
                break;
            case "-":
                res = v2 - v1;
                break;
            case "*":
                res = v2 * v1;
                break;
            default:
                res = v2 / v1;
                break;
        }
        return res;
    }

    private static boolean isNum(String value) {
        try {
            Double.parseDouble(value);
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
}

发表于 2024-03-20 00:01:05 回复(0)
对于本题你需要考虑以下几个问题:
//问题1:第一个数字与(数字,数字为负数的处理
//问题2:四则运算顺序,先乘除后加减
//问题3:括号问题,计算的先后顺序
//问题4:使用栈存储数字时计算应从左向右 否则会出现:3*5+8-0*3-6+0+0 15+8-0-6+0+0=29情况
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();
        //问题3:括号问题,计算的先后顺序
        s = s.replace("{", "(");
        s = s.replace("[", "(");
        s = s.replace("}", ")");
        s = s.replace("]", ")");
        //1+(8*2-1+3)
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //问题1:第一个数字与(数字,数字为负数的处理 将负数拼接 eg:-3+2*{1+2*[-4/(8-6)+7]}     (0-3)+2*(1+2*((0-4)/(8-6)+7))
            if (c == '-' && (i == 0 || (i > 1 && s.charAt(i - 1) == '('))) {
                stringBuilder.append("(0" + s.charAt(i) + "" + s.charAt(i + 1) + ")");
                i += 1;
            } else {
                stringBuilder.append(c);
            }
        }

        int result = handled(stringBuilder.toString());
        System.out.println(result);
    }


    private static int handled(String s) {
        Stack<Integer> numStack = new Stack<>();//数字栈
        Stack<Character> characterStack = new Stack<>();//字符栈
        int count = 0;//记录当前字符是否是大于10的数字
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                if (!numStack.isEmpty()&&count + 1 == i) {
                    Integer pop = numStack.pop();
                    numStack.push(Integer.valueOf(pop + "" + c));

                } else {
                    count = i;
                    numStack.push(Integer.valueOf(c + ""));
                }
            } else if (c == '(') {
                characterStack.push(c);
            } else if (c == ')') {
                while (!characterStack.isEmpty() && characterStack.peek() != '(') {
                    calcute(characterStack, numStack);
                }
                characterStack.pop();//弹出'('
            } else if (c == '+' || c == '-' || c == '*' || c == '/') {
                //问题2:四则运算顺序,先乘除后加减
                //问题4:使用栈存储数字时计算应从左向右 否则会出现:3*5+8-0*3-6+0+0 15+8-0-6+0+0=29情况
                while (!characterStack.isEmpty() &&
                        getPrecedence(characterStack.peek()) >= getPrecedence(c)) {
                    calcute(characterStack, numStack);
                }
                characterStack.push(c);
            }
        }
        //计算剩余非括号内的算式
        while (!characterStack.isEmpty()) {
            calcute(characterStack, numStack);
        }

        return numStack.pop(); // 返回最终计算结果
    }

    // 获取运算符的优先级
    public static int getPrecedence(char operator) {
        switch (operator) {
            case ')':
                return 0;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
        }
        return 0;
    }

    //进行计算
    public static void calcute(Stack<Character> characterStack,
                               Stack<Integer> numStack) {
        Integer a = numStack.pop();//先进后出,注意顺序
        Integer b = numStack.pop();
        Character operate = characterStack.pop();
        int result = 0;

        switch (operate) {
            case '-':
                result = b - a;
                break;
            case '+':
                result = b + a;
                break;
            case '*':
                result = b * a;
                break;
            case '/':
                result = b / a;
                break;
        }
        numStack.push(result);
    }
}




发表于 2024-01-31 15:47:51 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        line = line.replace("{", "(").replace("[", "(").replace("}", ")").replace("]",
                ")");
        String value = chuli(line);
        System.out.println(value);

    }
    //字符串处理,每次取 最中间的括号
    public static String chuli(String str) {
        String value = "0";
        if (str.contains("(")) {
            String[] lines = str.split("\\(");
            //取(的右边
            String left = lines[lines.length - 1];
            //取)的左边
            String jisuanStr = left.split("\\)")[0];
            //取出最中间括号的的字符串
            String valueTem = jisuan(jisuanStr);
            str = str.replace("(" + jisuanStr + ")", valueTem);
            if (!str.contains("(")) {

                value = jisuan(str);
            } else {
                value = chuli(str);
            }
        } else {
            value = jisuan(str);
        }
        return value;
    }
    //加减乘除运算
    public static String jisuan(String str) {
        //处理首个数为符号
        if (str.charAt(0) == '-') {
            str = "0" + str;
        }
        String[] nums = str.split("[+ \\- * /]");
        List<String> arr = new ArrayList<>();
        //将所有的数字取出
        for (int i = 0; i < nums.length; i++) {
            if ("".equals(nums[i]) && i <= nums.length - 2) {
                //存在 负数时 判断 元素是否为空 若为空 则下一个元素为负数
                arr.add("-" + nums[i + 1]);
                i++;
                // break;
            } else {
                arr.add(nums[i]);

            }
        }
        List<String> jj = new ArrayList<>();
        int index = 0;
        //处理乘除
        for (int i = 0; i < str.length(); i++) {

            int res = 0;
            if (str.charAt(i) == '/') {
                int a = Integer.parseInt(arr.get(index));
                int  b = Integer.parseInt(arr.get(index + 1));
                res = a / b;
                //计算两个数字的运算
                arr.remove(index);
                arr.remove(index);
                //数字存放数组中移除处理过的数字,并将新的计算结果放入数组中
                arr.add(index, String.valueOf(res));
            }
            if (str.charAt(i) == '*') {
                int a = Integer.parseInt(arr.get(index));
                int  b = Integer.parseInt(arr.get(index + 1));
                res = a * b;
                arr.remove(index);
                arr.remove(index);
                arr.add(index, String.valueOf(res));

            }
            if (str.charAt(i) == '+') {
                jj.add(String.valueOf(str.charAt(i)));
                index++;
            }
            if (str.charAt(i) == '-') {
                if (str.charAt(i - 1) == '*' || str.charAt(i - 1) == '/') {

                } else {
                    jj.add(String.valueOf(str.charAt(i)));
                    index++;
                }

            }
        }
        //若数字数组中 元素个数为1 则说明计算完成
        if (arr.size() == 1) {
            return arr.get(0);
        }
        int res = 0;
        //处理加减
        for (int i = 0; i < jj.size(); i++) {
            //若数字数组中 元素个数为1 则说明计算完成
            if (arr.size() == 1) {
                return arr.get(0);
            }
            if (jj.get(i).equals("+")) {
                int a = Integer.parseInt(arr.get(0));
                int  b = Integer.parseInt(arr.get(1));
                res = a + b;
                arr.remove(0);
                arr.remove(0);
                arr.add(0, String.valueOf(res));
            }
            if (jj.get(i).equals("-")) {
                int a = Integer.parseInt(arr.get(0));
                int  b = Integer.parseInt(arr.get(1));
                res = a - b;
                arr.remove(0);
                arr.remove(0);
                arr.add(0, String.valueOf(res));
            }

        }
        return String.valueOf(res);
    }

}

发表于 2024-01-25 13:00:48 回复(0)
都来看看我的垃圾代码吧

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    /**
     * 简单运算,只包含 加 减 乘 除
     *
     */
    public int sampleCal(String inputStr) {
         //负责处理只包含+-*/表达式局部运算
        Stack calStack = new Stack();
        //负责表达式中括号的完整性
        //Stack bracketStack = new Stack();
        int cur_char_type = -1;//当前字符类型 -1:未知 0:数字 1:字母
        int last_cal_type = -1;//上一个计算符号-1:未知  0: +或-   1: *或/
        int next_cal_type = -1;//下一个计算符号-1:未知  0: +或-   1: *或/
        StringBuilder digitSb = new StringBuilder();
        for(int i = 0; i < inputStr.length(); i ++) {
            char curChr = inputStr.charAt(i); 
            if(isDigit(curChr)) {
                //当前字符是数字
                cur_char_type = 0;
                digitSb.append(curChr);
                if(i + 1 < inputStr.length() 
                    && isDigit(inputStr.charAt(i + 1))) {
                    //下一个字符也是数字
                    continue;
                } else if(i + 1 >= inputStr.length()) {
                    //当前字符已经是最后一个字符
                    calStack.push(String.valueOf(digitSb));
                    digitSb = new StringBuilder();
                    if(!calStack.isEmpt() && calStack.getStackSize() == 3) {
                        //如果不为空,则出栈并计算
                        String curCal = "";
                        curCal = calStack.pop() + curCal;
                        curCal = calStack.pop() + curCal;
                        curCal = calStack.pop() + curCal;
                        int calResult = calAB(curCal);
                        //System.out.println(calResult);
                        return calResult;
                    } else if(!calStack.isEmpt() && calStack.getStackSize() > 3) {
                        while(!calStack.isEmpt()) {
                            String curCal = "";
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            int calResult = calAB(curCal);
                            if(calStack.isEmpt()) {
                                //System.out.println(calResult);
                                return calResult;
                            } else {
                                calStack.push(String.valueOf(calResult));
                            }
                        }
                    }
                } else {
                    //下一个字符不是数字,说明本次数字只有1个,已经取完
                    //TODO
                    String digit = digitSb.toString();
                    digitSb = new StringBuilder();
                    if(isMutiDiv(inputStr.charAt(i + 1))) {
                        //如果下一个符号是 *或/ 
                        if(last_cal_type == 1) {
                            //当前数字前面的符号是 * 或 /
                            //那么先入栈,再出栈3次把表达式取出,计算出表达式
                            calStack.push(digit);
                            String curCal = "";
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            int calResult = calAB(curCal);
                            calStack.push(String.valueOf(calResult));
                        } else if(last_cal_type == 0) {
                            //当前数字前面的符号是 + 或 -
                            calStack.push(digit);
                        } else if(last_cal_type == -1) {
                            //上一个符号未知,直接push
                            calStack.push(digit);
                        }
                    } else if(isAddSub(inputStr.charAt(i + 1))) {
                        if(last_cal_type == -1) {
                            //上一个符号未知,直接push
                            calStack.push(digit);
                        } else { 
                            //如果下一个符号是 + 或 -
                            //那么先入栈,再出栈3次把表达式取出,计算出表达式
                            //然后再入栈
                            calStack.push(digit);
                            String curCal = "";;
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            curCal = calStack.pop() + curCal;
                            int calResult = calAB(curCal);
                            calStack.push(String.valueOf(calResult));
                        }
                    }
                }
            } else if(isAddSub(curChr)) {
                if(!calStack.isEmpt() && calStack.getStackSize() == 3) {
                    //如果不为空,则出栈并计算
                    String curCal = "";
                    curCal = calStack.pop() + curCal;
                    curCal = calStack.pop() + curCal;
                    curCal = calStack.pop() + curCal;
                    int calResult = calAB(curCal);
                    calStack.push(String.valueOf(calResult));
                }
                last_cal_type = 0;
                if(i == 0 && curChr == '-') {
                    //如果第一个字符前面带有-号,默认在前面加上0
                    calStack.push("0"); 
                }
                calStack.push(String.valueOf(curChr)); 
            } else if(isMutiDiv(curChr)) {
                last_cal_type = 1;
                calStack.push(String.valueOf(curChr)); 
            }
        }
        return -1;
    }

    public void solution(String inputStr) {
        //负责表达式中括号的完整性
        Stack bracketStack = new Stack();
        
        if(!isContansBracket(inputStr)) {
            //没带括号
            int result = sampleCal(inputStr);
            System.out.println(result);
        } else {
            //带有扩号
            for(int i = 0; i < inputStr.length(); i ++) {
                char curChr = inputStr.charAt(i); 
                bracketStack.push(String.valueOf(curChr));
                if(isLittleBracketEnd(curChr)) {
                    //小括号结束符号
                    String sampleCalStr = "";
                    String popStr = "";
                    bracketStack.pop(); // (
                    do {
                        sampleCalStr = popStr + sampleCalStr;
                        popStr = bracketStack.pop();
                    } while (!isLittleBracketStart(popStr.charAt(0)));
                    //System.out.println(sampleCalStr);
                    int sampleCalResult = sampleCal(sampleCalStr);
                    bracketStack.push(String.valueOf(sampleCalResult));
                    if(sampleCalResult < 0 && bracketStack.getStackSize() != 1) {
                        //调整表达式结构  
                        adjustExpression(bracketStack);
                    }
                } else if(isMiddelBracketEnd(curChr)) {
                    //中括号结束位置
                    String sampleCalStr = "";
                    String popStr = "";
                    bracketStack.pop(); // (
                    do {
                        sampleCalStr = popStr + sampleCalStr;
                        popStr = bracketStack.pop();
                    } while (!isMiddelBracketStart(popStr.charAt(0)));
                    //System.out.println(sampleCalStr);
                    int sampleCalResult = sampleCal(sampleCalStr);
                    bracketStack.push(String.valueOf(sampleCalResult));
                    if(sampleCalResult < 0 && bracketStack.getStackSize() != 1) {
                        //调整表达式结构 
                        adjustExpression(bracketStack);
                    }
                } else if(isBigBracketEnd(curChr)) {
                    //大括号结束位置
                    String sampleCalStr = "";
                    String popStr = "";
                    bracketStack.pop(); // (
                    do {
                        sampleCalStr = popStr + sampleCalStr;
                        popStr = bracketStack.pop();
                    } while (!isBigBracketStart(popStr.charAt(0)));
                    //System.out.println(sampleCalStr);
                    int sampleCalResult = sampleCal(sampleCalStr);
                    bracketStack.push(String.valueOf(sampleCalResult));
                    if(sampleCalResult < 0 && bracketStack.getStackSize() != 1) {
                        //调整表达式结构 
                        adjustExpression(bracketStack);
                    }
                }
            }
            if(!bracketStack.isEmpt() && bracketStack.getStackSize() == 1) {
                //如果栈中只有一个值,直接输出答案
                System.out.println(bracketStack.pop());
            } else { 
                //计算最终的表达式
                String sampleCalStr = "";
                String popStr = "";
                while(!bracketStack.isEmpt()) {        
                    popStr = bracketStack.pop();
                    sampleCalStr = popStr + sampleCalStr;
                }
                //System.out.println(sampleCalStr);
                int result = sampleCal(sampleCalStr);
                System.out.println(result);
            }
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Main m = new Main();
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            m.solution(in.nextLine());
        }
    }

    /**
     * 对带有 - 号在后面的表达式调整格式, 例如5-3+9*6*-6调整成5-3-9*6*6方便计算
     */
    public void adjustExpression(Stack bracketStack) {
        Stack tmpStack = new Stack();
        String topVal = bracketStack.pop();
        int topValAbs = Math.abs(Integer.valueOf(topVal));
        tmpStack.push(String.valueOf(topValAbs));
        String chkFlag = bracketStack.pop();
        if(!"+".equals(chkFlag) && !"-".equals(chkFlag)) {
            tmpStack.push(chkFlag);
        }
        while(isMutiDiv(chkFlag.charAt(0)) || isDigit(chkFlag.charAt(0))) {
            //如果是 * 或者 / 
            //继续弹出栈
            chkFlag = bracketStack.pop();
             if(!"+".equals(chkFlag) && !"-".equals(chkFlag)) {
                tmpStack.push(chkFlag);
             }
        }
        //如果遇到 + -
        //则替换成 - + 
        if("+".equals(chkFlag)) {
            tmpStack.push("-");
        } else if("-".equals(chkFlag)) {
            tmpStack.push("+");
        }
        while(!tmpStack.isEmpt()) {
            bracketStack.push(tmpStack.pop());
        }
    }

    public static Integer calAB(String curCal) {
        if(curCal.contains("+")) {
            String[] paramArray = curCal.split("\\+");
            int result = Integer.valueOf(paramArray[0]) + Integer.valueOf(paramArray[1]);
            return result;
        } else if(curCal.contains("-")) {
            String[] paramArray = curCal.split("\\-");
            int result;
            if(paramArray.length == 3 && "".equals(paramArray[0])) {
                //表达式前面为 -
                result = - Integer.valueOf(paramArray[1]) - Integer.valueOf(paramArray[2]);
            } else { 
                result = Integer.valueOf(paramArray[0]) - Integer.valueOf(paramArray[1]);
            }
            return result;
        } else if(curCal.contains("*")) {
            String[] paramArray = curCal.split("\\*");
            int result = Integer.valueOf(paramArray[0]) * Integer.valueOf(paramArray[1]);
            return result;
        } else if(curCal.contains("/")) {
            String[] paramArray = curCal.split("\\/");
            int result = Integer.valueOf(paramArray[0]) / Integer.valueOf(paramArray[1]);
            return result;
        }
        return null;
    }

    /**
     * 判断某个字符是否是数字
       @param chkChar 要判断的字符
       @return 是否是数字(true:数字 false:非数字)
     */
    private static boolean isDigit(char chkChar) {
        if(chkChar >= '0' && chkChar <= '9' ) {
            return true;
        }
        return false;
    }

    private static boolean isAddSub(char chkChar) {
        if(chkChar == '+' || chkChar == '-') {
            return true;
        }
        return false;
    }

    private static boolean isMutiDiv(char chkChar) {
        if(chkChar == '*' || chkChar == '/') {
            return true;
        }
        return false;
    }

    private static boolean isContansBracket(String inputStr) {
        if(inputStr.contains("(") || inputStr.contains("[") || inputStr.contains("{")
        || inputStr.contains(")") || inputStr.contains("]") || inputStr.contains("}")) {
            return true;
        }
        return false;
    }

    /**
     * 判断某个字符是否是小括号的开始
     *  @param chkChar 要判断的字符
     * @return 是否是小括号的开始(true:是 false:否)
     */
    private static boolean isLittleBracketStart(char chkChar) {
        return chkChar == '(' ? true : false;
    }

    /**
     * 判断某个字符是否是小括号的结束
     *  @param chkChar 要判断的字符
     * @return 是否是小括号的结束(true:是 false:否)
     */
    private static boolean isLittleBracketEnd(char chkChar) {
        return chkChar == ')' ? true : false;
    }

    /**
     * 判断某个字符是否是中括号的开始
     *  @param chkChar 要判断的字符
     * @return 是否是中括号的开始(true:是 false:否)
     */
    private static boolean isMiddelBracketStart(char chkChar) {
        return chkChar == '[' ? true : false;
    }

    /**
     * 判断某个字符是否是中括号的结束
     *  @param chkChar 要判断的字符
     * @return 是否是中括号的结束(true:是 false:否)
     */
    private static boolean isMiddelBracketEnd(char chkChar) {
        return chkChar == ']' ? true : false;
    }

    /**
     * 判断某个字符是否是大括号的开始
     *  @param chkChar 要判断的字符
     * @return 是否是大括号的开始(true:是 false:否)
     */
    private static boolean isBigBracketStart(char chkChar) {
        return chkChar == '{' ? true : false;
    }

    /**
     * 判断某个字符是否是中括号的结束
     *  @param chkChar 要判断的字符
     * @return 是否是大括号的结束(true:是 false:否)
     */
    private static boolean isBigBracketEnd(char chkChar) {
        return chkChar == '}' ? true : false;
    }

    /**
     *  栈
     */
    static class Stack {
        //栈顶指针
        private int stackIndex = 0;
        //保存栈的内容
        private String[] elementData = new String[1000];

        /**
         * 入栈
         */
        public void push(String element) {
            elementData[stackIndex] = element;
            stackIndex ++;
        }

        /**
         * 出栈
         */
        public String pop() {
            String result = elementData[stackIndex - 1];
            stackIndex --;
            return result;
        }

        public boolean isEmpt() {
            return stackIndex == 0 ? true : false;
        }

        public int getStackSize() {
            return stackIndex;
        }
    }
}





发表于 2024-01-15 22:22:55 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @className: _4_9
 * @author: Lian
 * @date: 2023-10-03 16:51
 */
public class _5_0 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Character> operator = new Stack<>();
        ArrayList<String> list = new ArrayList<>();
        Map<Character, Integer> hashMap = new HashMap<>();
        Stack<Double> stack = new Stack<>();
        hashMap.put('(', 0);
        hashMap.put('-', 1);
        hashMap.put('+', 1);
        hashMap.put('*', 2);
        hashMap.put('/', 2);
        StringBuilder str = new StringBuilder(br.readLine().replace('{', '(').replace('}', ')').replace('[', '(').replace(']', ')'));
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == '-')
                count++;
        }
        while (true) {
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == '-') {
                    if (i == 0 ||str.charAt(i)=='(') {
                        str.insert(i + 2, ")");
                        str.insert(i, "(0");
                        break;
                    }
                }
            }
            break;
        }

        char[] chars = str.toString().toCharArray();

        for (int i = 0; i < chars.length; i++) {
            if (Character.isDigit(chars[i])) {
                int j = 0;
                while (i+j<chars.length&&Character.isDigit(chars[i + j])) {
                    j++;
                }
                list.add(String.copyValueOf(chars, i, j));
                i=i+j-1;
                continue;
            }
            if (chars[i] == '(') {
                operator.push(chars[i]);
                continue;
            }
            if (chars[i] == ')') {
                while (operator.peek() != '(') {
                    char c = operator.pop();
                    list.add(String.valueOf(c));
                }
                operator.pop();
                continue;
            }
            if (operator.isEmpty()) {
                operator.push(chars[i]);
                continue;
            }
            while (!operator.isEmpty() && hashMap.get(chars[i]) <= hashMap.get(operator.peek())) {
                char c = operator.pop();
                list.add(String.valueOf(c));
            }
            operator.push(chars[i]);
        }
        while (!operator.isEmpty()) {
            list.add(String.valueOf(operator.pop()));
        }

        for (int i = 0; i < list.size(); i++) {
            if (Character.isDigit(list.get(i).charAt(0))) {
                stack.push(Double.valueOf(list.get(i)));
                continue;
            }
            double a = stack.pop();
            double b = stack.pop();
            if (list.get(i).equals("+")) {
                stack.push(a + b);
                continue;
            }
            if (list.get(i).equals("*")) {
                stack.push(a * b);
                continue;
            }
            if (list.get(i).equals("-")) {
                stack.push(b - a);
                continue;
            }
            if (list.get(i).equals("/")) {
                stack.push(b / a);
            }
        }

        System.out.printf("%.0f%n", stack.peek());
    }
}

发表于 2023-10-03 22:51:54 回复(1)
public class Test01 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { 
            String str = in.nextLine();
            System.out.println(solution(str));
        }
    }
    public static int solution(String str){
        Stack<Integer> numStack = new Stack<>();
        Stack<Character> pStack = new Stack<>();
        for (int i = 0; i < str.length(); i++) {
            char a = str.charAt(i);
            //1、如果是括号
            if(a=='('||a=='['||a=='{'){ 
                pStack.push(a);
                int end = i;
                //找到括号的结尾
                for (int j = i+1; j < str.length(); j++) {
                    char k = str.charAt(j);
                    if(k=='('||k=='['||k=='{'){
                        pStack.push(k);
                    }else if(k==')'||k==']'||k=='}'){
                        pStack.pop();
                        if(pStack.isEmpty()||(pStack.peek()!='('&& pStack.peek()!='{'&& pStack.peek()!='[')){
                            end = j;
                            break;
                        }
                    }
                }
                //递归计算括号中的结果push到数字栈中。
                numStack.push(solution(str.substring(i+1,end)));
                //更新i的值。
                i=end;
            }else if((i==0&&a=='-')||Character.isDigit(a)){ //2、找到的是数字,需要考虑负数开头。
                String num = a+"";
                i++;
                while(i<str.length()&&Character.isDigit(str.charAt(i))){
                    num+=str.charAt(i);
                    i++;
                }
                numStack.push(Integer.parseInt(num));
                i--;
            }else{ //3、找到的是符号
                if(!pStack.isEmpty()){
                    //如果找到的符号运算级小于等于栈中的符号,则先计算栈中的,如果大于栈中运算符,直接push。
                    if(a=='+'||a=='-'){
                        //遇到+、-需要将栈中的全部都计算了。
                        while(!pStack.isEmpty()){
                            numStack.push(operation(numStack.pop(),numStack.pop(),pStack.pop()));
                        }
                    }else if((a=='*'|| a=='/')&&(pStack.peek()=='*'||pStack.peek()=='/')){
                        numStack.push(operation(numStack.pop(),numStack.pop(),pStack.pop()));
                    }
                }
                //将运算符压入符号栈。
                pStack.push(a);
            }
        }
        //计算剩余元素的结果。
        while(!pStack.isEmpty()){
            numStack.push(operation(numStack.pop(),numStack.pop(),pStack.pop()));
        }
        return numStack.pop();
    }
    public static int operation(int a , int b , Character p){
        if(p=='+'){
            return b+a;
        }else if(p=='-'){
            return b-a;
        }else if(p=='*'){
            return b*a;
        }else{
            return b/a;
        }
    }
}

发表于 2023-05-14 18:26:02 回复(0)
这道题对java来说还是有点复杂的,看了几个大佬的代码,发现看不太懂,我就写了一个自认为逻辑简单的方法,供参考 
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String express = in.next();
        express = express.replace("{", "(");
        express = express.replace("[", "(");
        express = express.replace("}", ")");
        express = express.replace("]", ")");

        System.out.print(comput(dealParent(express)));

    }
    // 处理括号
    public static String dealParent(String str) {
        ArrayList<Integer> parent = new ArrayList<>();
        char[] carr = str.toCharArray();
        String temp = str;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < carr.length; i++) {
            if (carr[i] == '(') {
                parent.add(i);
            }
            if (carr[i] == ')') {
                int start = parent.get(parent.size() - 1);
                String com = temp.substring(start + 1, i);
                String res = comput(com);
                sb.append(temp.substring(0, start));
                // 添加空格补齐位数
                int differ = i - start + 1 - res.length();
                for (int j = 0; j < differ; j++) {
                    sb.append(" ");
                }
                sb.append(res);
                if (i != carr.length - 1) {
                    sb.append(temp.substring(i + 1, temp.length()));
                }
                temp = sb.toString();
                sb.setLength(0);
                parent.remove(parent.size() - 1);
            }
        }
        return temp;
    }
    // 将字符串公式拆分成字符串数组
    public static ArrayList<String> toStrArr(String str) {
        str = str.replace(" ", "");
        ArrayList<String> exArr = new ArrayList<>();
        char[] carr = str.toCharArray();
        int start = 0;
        for (int i = 0; i < carr.length; i++) {
            if (i == 0 && carr[i] == '-') {
                continue;
            }
            if (carr[i] == '-' && (carr[i - 1] == '+' || carr[i - 1] == '*' ||
                                   carr[i - 1] == '/' || carr[i - 1] == '-')) {
                continue;
            }
            if (carr[i] == '+' || carr[i] == '-' || carr[i] == '*' || carr[i] == '/') {
                exArr.add(str.substring(start, i));
                exArr.add(str.substring(i, i + 1));
                start = i + 1;
            }
            if (i == carr.length - 1) {
                exArr.add(str.substring(start, carr.length));
            }
        }
        return exArr;
    }
    // 不带括号的计算
    public static String comput(String str) {
        ArrayList<String> arr = toStrArr(str);
        for (int i = 0; i < arr.size(); i++) {
            if (arr.get(i).equals("*") || arr.get(i).equals("/")) {
                int a = Integer.parseInt(arr.get(i - 1));
                int b = Integer.parseInt(arr.get(i + 1));
                int res;
                if (arr.get(i).equals("*")) {
                    res = a * b;
                } else {
                    res = a / b;
                }
                arr.set(i + 1, String.valueOf(res));
                arr.set(i, " ");
                arr.set(i - 1, " ");
                i++;
            }
        }
        while (arr.contains(" ")) {
            arr.remove(" ");
        }
        for (int i = 0; i < arr.size(); i++) {
            if (arr.get(i).equals("+") || arr.get(i).equals("-")) {
                int a = Integer.parseInt(arr.get(i - 1));
                int b = Integer.parseInt(arr.get(i + 1));
                int res;
                if (arr.get(i).equals("+")) {
                    res = a + b;
                } else {
                    res = a - b;
                }
                arr.set(i + 1, String.valueOf(res));
                arr.set(i, " ");
                arr.set(i - 1, " ");
                i++;
            }
        }
        while (arr.contains(" ")) {
            arr.remove(" ");
        }
        return arr.get(0);
    }

}

发表于 2023-05-13 12:54:46 回复(0)
华为OD深圳/西安岗位,部门急招,薪资20-80w. 部门有专门机考辅导人员,每周开视频讲座。欢迎叨扰:***********
编辑于 2023-05-10 15:59:13 回复(0)
import java.util.*;

// 大无语,怎么有这种这么繁琐的题啊 !!!!
public class Main {
    public static int index = 0;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        System.out.println(getExpression(s));
    }
    public static int getExpression(String s) {
        ArrayList<Integer> numArray = new ArrayList<>();
        ArrayList<Character> signArray = new ArrayList<>();
        HashMap<Character, Character> hp = new HashMap<>();
        hp.put('[', ']');
        hp.put('(', ')');
        hp.put('{', '}');

        int i = 0;
        int count = 0;
        StringBuilder strBuilder;
        while (i < s.length()) {
            if (i >= s.length()) break;
            char ch = s.charAt(i);
            if (ch == '(' || ch == '[' || ch == '{') {
                i++;
                count = 0;
                strBuilder = new StringBuilder();
                while (i < s.length() && (s.charAt(i) != hp.get(ch) || count != 0)) {
                    if (s.charAt(i) == ch) count++;
                    if (s.charAt(i) == hp.get(ch)) count--;
                    strBuilder.append(s.charAt(i));
                    i++;
                }
                i++;
                numArray.add(getExpression(strBuilder.toString()));
            }else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
                signArray.add(ch);
                i++;
            } else {
                int num = 0;
                while (i < s.length() && s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                    num = num * 10 + s.charAt(i) - '0';
                    i++;
                }
                numArray.add(num);
            }
        }
        
        Stack<Character> signStack = new Stack<>();
        Stack<Integer> numStack = new Stack<>();
        int indexArrayNum = 0, indexArraySign = 0;
        if (numArray.size() == signArray.size()) {
            numArray.set(0,-numArray.get(0));
            indexArraySign++;
        }
        numStack.push(numArray.get(indexArrayNum++));
        while (indexArraySign < signArray.size()) {
            char ch = signArray.get(indexArraySign++);
            if (ch == '+' || ch == '-') {
                signStack.push(ch);
                numStack.push(numArray.get(indexArrayNum++));
            }
            else if (ch == '*') {
                int a = numStack.pop();
                int b = numArray.get(indexArrayNum++);
                numStack.push(a * b);
            }else {
                int a = numStack.pop();
                int b = numArray.get(indexArrayNum++);
                numStack.push(a / b);
            }
        }
        Stack<Character> signStack02 = new Stack<>();
        Stack<Integer> numStack02 = new Stack<>();
        while (!signStack.isEmpty()) {
            signStack02.push(signStack.pop());
        }
        while (!numStack.isEmpty()) {
            numStack02.push(numStack.pop());
        }
        while (!signStack02.isEmpty()) {
            int a = numStack02.pop();
            int b = numStack02.pop();
            char ch = signStack02.pop();
            if (ch == '+')
                numStack02.push(a + b);
            else
                numStack02.push(a - b);
        }

        return numStack02.pop();
    }
}

发表于 2023-03-11 01:35:14 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String msg = in.nextLine();
            msg = msg.replaceAll("\\{", "(");
            msg = msg.replaceAll("}", ")");
            msg = msg.replaceAll("\\[", "(");
            msg = msg.replaceAll("]", ")");
            while (msg.contains(")")) {
                msg = removeKuo(msg);
            }
            System.out.println(yunsuan(msg));
        }
    }

    private static ArrayList<String> params = new ArrayList<>();

    private static String removeKuo(String msg) {
        int end = msg.indexOf(")");
        int start = 0;
        for (int i = end; i >= 0; i--) {
            if (msg.charAt(i) == '(') {
                start = i;
                break;
            }
        }
        String tmp = msg.substring(start + 1, end);
        tmp = yunsuan(tmp);
        return msg.replace(msg.substring(start, end + 1), tmp);
    }

    private static String yunsuan(String msg) {
        params.clear();
        String tmp = "";
        boolean hasDigit = false;
        for (int i = 0; i < msg.length(); i++) {
            if (Character.isDigit(msg.charAt(i))) {
                hasDigit = true;
                tmp = tmp + msg.charAt(i);
            } else {
                if (hasDigit) {
                    params.add(tmp);
                    params.add(String.valueOf(msg.charAt(i)));
                    tmp = "";
                    hasDigit = false;
                } else {
                    tmp = tmp + msg.charAt(i);
                }
            }
        }
        params.add(tmp);
        while (params.contains("*")) {
            int index = params.indexOf("*");
            int pre = Integer.parseInt(params.remove(index - 1));
            params.remove(index - 1);
            int next = Integer.parseInt(params.remove(index - 1));
            params.add(index - 1, String.valueOf(pre * next));
        }
        while (params.contains("/")) {
            int index = params.indexOf("/");
            int pre = Integer.parseInt(params.remove(index - 1));
            params.remove(index - 1);
            int next = Integer.parseInt(params.remove(index - 1));
            params.add(index - 1, String.valueOf(pre / next));
        }
        while (params.size() > 1) {
            int pre = Integer.parseInt(params.remove(0));
            String fu = params.remove(0);
            int next = Integer.parseInt(params.remove(0));
            params.add(0, String.valueOf("+".equals(fu) ? pre + next : pre - next));
        }
        return params.get(0);
    }
}


发表于 2023-01-24 23:36:04 回复(1)
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        //中括号、大括号全部转为小括号,方便处理
        str = str.replace('[', '(');
        str = str.replace('{', '(');
        str = str.replace(']', ')');
        str = str.replace('}', ')');
        //1.将String类型的中缀表达式转成List<String>类型的中缀表达式
        List<String> infixList = infixStringToList(str);
        //2.将List<String>类型的中缀表达式转成List<String>类型的后缀表达式
        List<String> suffixList = infixToSuffix(infixList);
        //3.将List<String>类型的后缀表达式进行计算
        int res = calculateSuffixNotation(suffixList);
        System.out.println(res);
    }
    //1.将String类型的中缀表达式转成List<String>类型
    public static List<String> infixStringToList(String str) {
        List<String> list = new ArrayList<>();
        int i = 0;
        while (i < str.length()) {
            if (str.charAt(i) == '+' || str.charAt(i) == '*' || str.charAt(i) == '/' || str.charAt(i) == '(' || str.charAt(i) == ')') {
                list.add(String.valueOf(str.charAt(i)));
                i++;
            } else if (str.charAt(i) == '-') {//考虑负数
                if ((str.charAt(i) == '-' && str.charAt(i-1) == '(' && str.charAt(i+1)>= 48 && str.charAt(i+1)<= 57) || (str.charAt(i) == '-' && i == 0 && str.charAt(i+1)>= 48 && str.charAt(i+1)<= 57)) {
                    list.add(String.valueOf(str.charAt(i))+String.valueOf(str.charAt(i+1)));
                    i = i + 2;
                } else {
                    list.add(String.valueOf(str.charAt(i)));
                    i++;
                }
            } else {
                StringBuilder sb = new StringBuilder();
                //考虑多位数
                while (i < str.length() && str.charAt(i) >= 48 && str.charAt(i) <= 57) {
                    sb.append(str.charAt(i));
                    i++;
                }
                list.add(sb.toString());
            }
        }
        return list;
    }
    //2.将List<String>类型的中缀表达式转成List<String>类型的后缀表达式
    public static List<String> infixToSuffix(List<String> infixList) {
        Stack<String> operationStack = new Stack<>();
        List<String> tempResList = new ArrayList<>();
        for (String s : infixList) {
            if (s.matches("\\d+")) {
                tempResList.add(s);
            } else if (s.matches("-\\d+")) {
                tempResList.add(s);
            } else if ("(".equals(s)) {
                operationStack.push(s);
            } else if (")".equals(s)) {
                while (!operationStack.peek().equals("(")) {
                    tempResList.add(operationStack.pop());
                }
                operationStack.pop();//去掉"("
            } else {
                //如果s的运算优先级小于等于operationStack栈顶元素的优先级
                //将operationStack栈顶元素弹出并加入tempResList中
                //直到s可以入operationStack栈
                while (operationStack.size() != 0 && operationPriority(s) <= operationPriority(operationStack.peek())) {
                    tempResList.add(operationStack.pop());
                }
                operationStack.push(s);
            }
        }
        while (operationStack.size() != 0) {
            tempResList.add(operationStack.pop());
        }
        return tempResList;
    }
    //3.将List<String>类型的后缀表达式进行计算
    //思想:遇到数字入栈,遇到操作符则将栈顶元素和栈顶元素的下一个元素进行操作符对应的运算后入栈
    //     其中被减数和被除数是栈顶元素的下一个元素
    public static int calculateSuffixNotation(List<String> suffixList) {
        Stack<Integer> stack = new Stack<>();
        for (String s : suffixList) {
            if ("+".equals(s)) {
                stack.push(stack.pop()+stack.pop());
            } else if ("-".equals(s)) {
                stack.push(-stack.pop()+stack.pop());
            } else if ("*".equals(s)) {
                stack.push(stack.pop()*stack.pop());
            } else if ("/".equals(s)) {
                int temp1 = stack.pop();
                int temp2 = stack.pop();
                stack.push(temp2 / temp1);
            } else {
                stack.push(Integer.parseInt(s));
            }
        }
        //经过以上运算最终栈中只剩下一个元素
        return stack.pop();
    }
    public static int operationPriority(String operation) {
        if ("+".equals(operation) || "-".equals(operation)) {
            return 0;
        } else if ("*".equals(operation) || "/".equals(operation)) {
            return 1;
        } else {
            return -1;
        }
    }
}

发表于 2022-12-17 01:31:57 回复(0)
测试用例不全,应包含自测运行中的例程.
发表于 2022-10-13 22:37:54 回复(0)
构建逆波兰式,然后再进行计算,需要注意[-1]的情况
import java.io.IOException;
import java.util.*;
class Solution{
    LinkedList<String> nibolan = new LinkedList<>();
    Stack<Character> oper = new Stack<>();
    Stack<Integer> num = new Stack<>();
    // 构建逆波兰
    public void buildNibolan(String s){
        char[] chars = s.toCharArray();
        if(s.charAt(0)=='-'){
            nibolan.addLast(String.valueOf(0));
        }
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if(!Character.isDigit(c)){
                if((c=='['||c=='{'||c=='(') &&chars[i+1]=='-'){
                    nibolan.addLast(String.valueOf(0));
                }
                removeChar(c);
                if(c!='}'&&c!=')'&&c!=']'){
                    oper.add(c);
                }
                continue;
            }
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(c);
            int j = i++;
            for(;i<chars.length;i++){
                if(!Character.isDigit(chars[i])){
                   break;
                }
                stringBuilder.append(chars[i]);
            }
            i--;
            nibolan.addLast(stringBuilder.toString());
        }
        // 清空oper栈
        while (!oper.isEmpty()){
            nibolan.addLast(String.valueOf(oper.pop()));
        }
    }

    public int process(String s){
        buildNibolan(s);
        // 计算
        while (!nibolan.isEmpty()){
            String s1 = nibolan.removeFirst();
            if(Character.isDigit(s1.charAt(0))){
                num.push(Integer.valueOf(s1));
            }else{
                num.push(calcute(num.pop(),num.pop(),s1.charAt(0)));
            }
        }
        return num.pop();
    }

    public int calcute(int a,int b,char c){
        switch (c){
            case '-':return b-a;
            case '+':return b+a;
            case '*':return b*a;
            case '/':return b/a;
        }
        return 0;
    }

    // 移除操作符栈的字符
    public void removeChar(char c){
        if(oper.isEmpty()){
            return;
        }
        if(c==')'||c=='}'||c==']'){
            char compare = c==')'?'(':c=='}'?'{':'[';
            while (true){
                char preC = oper.pop();
                if(preC==compare){
                    return;
                }
                nibolan.addLast(String.valueOf(preC));
            }
        }
        while (!oper.isEmpty()){
            if(!isBigger(oper.peek(),c)){
                nibolan.addLast(String.valueOf(oper.pop()));
            }else {
                return;
            }
        }
    }
    // 判断优先级
    public boolean isBigger(char a,char b){
        if(a=='('||b=='('||a=='{'||b=='{'||a=='['||b=='['){
            return true;
        }
        if(b=='+'||b=='-'){
            return  false;
        }
        return a == '+' || a == '-';
    }

}
public class Main{

    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        Solution solution = new Solution();
        System.out.println(solution.process(s));

    }
}


发表于 2022-08-20 10:14:34 回复(0)
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.nextLine();
            s.replace("{", "(");
            s.replace("}", ")");
            s.replace("[", "(");
            s.replace("]", ")");
            char[] chars = s.toCharArray();
            LinkedList stringStack = new LinkedList();
            LinkedList digitStack = new LinkedList();
            //先将输入的运算表达式变为后缀表达式
            //创建一个链表存放后缀表达式
            LinkedList list = new LinkedList();
            //存放数字字符
            StringBuilder digit = new StringBuilder();
            for (int i = 0; i < chars.length; i++) {
                if (Character.isDigit(chars[i])) {
                    if (i == chars.length - 1) {
                        digit.append(chars[i]);
                        list.add(digit.toString());
                        digit.delete(0, digit.length());
                    } else if (Character.isDigit(chars[i + 1])) {
                        digit.append(chars[i]);
                    } else {
                        digit.append(chars[i]);
                        list.add(digit.toString());
                        digit.delete(0, digit.length());
                    }
                } else if (chars[i] == '(') {
                    stringStack.push(String.valueOf(chars[i]));
                } else if (chars[i] == ')') {
                    while (stringStack.peek() != null) {
                        if (stringStack.peek().equals("(")) {
                            stringStack.pop();
                            break;
                        }
                        list.add(stringStack.pop());
                    }
                } else {
                    if (chars[i] == '+' || chars[i] == '-') {
                        while (stringStack.peek() != null && (stringStack.peek().equals("*")
                                                              || stringStack.peek().equals("/")
                                                              || stringStack.peek().equals("+")
                                                              || stringStack.peek().equals("-"))) {
                            if (stringStack.peek().equals("(")) {
                                break;
                            }
                            list.add(stringStack.pop());
                        }
                    }
                    stringStack.push(String.valueOf(chars[i]));
                }
                if (i == chars.length - 1) {
                    while (stringStack.peek() != null) {
                        list.add(stringStack.pop());
                    }
                }
            }
            int num1 = 0;
            int num2 = 0;
            //将后缀表达式进行计算
            for (int i = 0; i < list.size(); i++) {
                char[] c = list.get(i).toCharArray();
                if (Character.isDigit(c[0])) {
                    digitStack.push(Integer.parseInt(list.get(i)));
                    continue;
                }
                switch (list.get(i)) {
                    case "-":
                        num2 = digitStack.pop();
                        num1 = digitStack.pop();
                        digitStack.push(num1 - num2);
                        break;
                    case "+":
                        num2 = digitStack.pop();
                        num1 = digitStack.pop();
                        digitStack.push(num1 + num2);
                        break;
                    case "*":
                        num2 = digitStack.pop();
                        num1 = digitStack.pop();
                        digitStack.push(num1 * num2);
                        break;
                    case "/":
                        num2 = digitStack.pop();
                        num1 = digitStack.pop();
                        digitStack.push(num1 / num2);
                        break;
                }
            }
            System.out.println(digitStack.peek());
        }
    }
}
发表于 2022-08-05 19:18:51 回复(0)
感觉python的eval函数是真的强  但是之前不知道  所以直接用了两个栈 而且这里的特殊处理也太复杂 (使用的是遇到初始时或者左括号后面  判断是否马上接的是正负号,如果是‘+’,则相当于*1,如果是‘-’,则相当于*-1)   其实直接在nums中多放入一个0就可以解决了
import java.util.HashMap;
import java.util.Scanner;
import java.util.Stack;

/**
 * @author YXQ
 * @create 2022/8/4  21:14
 */
public class Main {
    public static void main(String[] args)  {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        System.out.println(convertAndCal(str));


    }
    static HashMap<Character,Integer> priorityMap=new HashMap(){
        {
            put('*',2);
            put('/',2);
            put('+',1);
            put('-',1);
        }
    };
    static HashMap<Character,Character>kuoHao=new HashMap(){
        {
            put(')','(');
            put(']','[');
            put('}','{');
        }
    };
    public static int  convertAndCal(String str){
        Stack<Character> ops=new Stack<>();
        Stack<Integer> nums=new Stack<>();
        char[] chars=str.toCharArray();
        for (int i=0;i<chars.length;i++){
//             System.out.println("chars[i]:"+chars[i]);
            if(i==0){
                i=teShuChuLi(chars,i,str,ops,nums);
            }else if(i>=1&&kuoHao.containsValue(chars[i-1])){
                i=teShuChuLi(chars,i,str,ops,nums);
            }else{
                if(kuoHao.containsValue(chars[i]))ops.push(chars[i]);
                else if(chars[i]>='0'&&chars[i]<='9'){
                    int j=i;
                    while (j<chars.length&&Character.isDigit(chars[j]))j++;
                    nums.add(Integer.parseInt(str.substring(i,j)));
                    i=j-1;
                }
                else if(priorityMap.containsKey(chars[i])){
                    if(ops.isEmpty()|| kuoHao.containsValue(ops.peek())||priorityMap.get(ops.peek())<priorityMap.get(chars[i])){
//                         System.out.println("why");
                        ops.push(chars[i]);
                    }else{
                        while (!ops.isEmpty()&&!kuoHao.containsValue(ops.peek())&&priorityMap.get(ops.peek())>=priorityMap.get(chars[i])){
                            nums.push(cal(ops.pop(),nums.pop(),nums.pop()));
                        }
                        ops.push(chars[i]);
                    }
                }else if(kuoHao.containsKey(chars[i])){
                    while (!(ops.peek()==kuoHao.get(chars[i]))){
                        nums.push(cal(ops.pop(),nums.pop(),nums.pop()));
                    }
                    ops.pop();
                }
            }
//             for(int num:nums) System.out.print(num+" ");
//             System.out.println();
//             for (char ch:ops) System.out.print(ch+" ");
//             System.out.println();
        }
        while (!ops.isEmpty()){
            nums.push(cal(ops.pop(),nums.pop(),nums.pop()));
        }
        return nums.peek();

    }
    public static int teShuChuLi(char[] chars,int index,String str,Stack<Character> ops,Stack<Integer> nums){
        char c=chars[index];
        if(c=='+'){
            nums.push(1);
            ops.push('*');
        }else if(c=='-') {
            nums.push(-1);
            ops.push('*');
        }else if(c>='0'&&c<='9'){
            int j=index;
            while (j<chars.length&&Character.isDigit(chars[j]))j++;
            nums.add(Integer.parseInt(str.substring(index,j)));
            index=j-1;
        }else{
            ops.push(c);
        }
        return index;
    }
    public static int  cal(char c,int b,int a){
        if(c=='*')return a*b;
        else if(c=='/')return a/b;
        else if(c=='+')return a+b;
        else return a-b;
    }

}


发表于 2022-08-05 15:53:24 回复(0)
// 只需注意第一个数和括号里面的第一个数是否为负数,如果是负数,提前加个0
// 如果未遇到右括号时,运算符以左括号为边界,如(1+2+3*4),先计算1+2->(3+3*4)
import java.util.*;

public class Main{
    static Deque<Character> ops = new LinkedList<>();
    static Deque<Integer> nums = new LinkedList<>();
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        if (s.charAt(0) == '-') {
            nums.push(0);
        }
        Map<Character, Integer> map = new HashMap<>();
        map.put('+', 1);
        map.put('-', 1);
        map.put('*', 2);
        map.put('/', 2);
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                int num = 0, j = i;
                while (j < s.length() && Character.isDigit(s.charAt(j))) {
                    num = num * 10 + s.charAt(j++) - '0';
                }
                nums.push(num);
                i = j - 1;
            } else if (c == '(' || c == '{' || c == '[') {
                ops.push(c);
                if (s.charAt(i + 1) == '-') {
                    nums.push(0);
                }
            } else if (c == ')' || c == '}' || c == ']') {
                while (ops.peek() != '(') {
                    eval();
                }
                ops.pop();
            } else {
                while (!ops.isEmpty() && ops.peek() != '(' && map.get(ops.peek()) >= map.get(c)) {
                    eval();
                }
                ops.push(c);
            }
        }
        while (!ops.isEmpty()) {
            eval();
        }
        System.out.println(nums.peek());
    }
    
    static void eval() {
        int b = nums.pop(), a = nums.pop();
        char c = ops.pop();
        if (c == '+') {
            nums.push(a + b);
        } else if (c == '-') {
            nums.push(a - b);
        } else if (c == '*') {
            nums.push(a * b);
        } else {
            nums.push(a / b);
        }
    }
}

发表于 2022-08-01 11:39:56 回复(0)
用递归处理括号,用栈记录表达式各分段的值,根据加减号分段,temp和number分别是运算符的左右数值.栈中各数之和就是计算结果
略作调整: 用两个变量替换栈,result和temp (result是前面n个分段的和, temp是栈顶)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

/**
 * 描述:四则运算
 *
 * @date 2022-07-12
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        String input = "";
        while ((input = bfr.readLine()) != null) {
            input = input.replace("[", "(");
            input = input.replace("{", "(");
            input = input.replace("}", ")");
            input = input.replace("]", ")");
            input = input.replace(")(", ")*(");//考虑到(xxx)(xxx)情况,中间加上*
            int result = cal(input);
            System.out.println(result);
        }
    }

    /* 四则运算计算
     * 示例: 3+(9-7)-5*2+6
     * 本方法处理说明: 
     *    1. (9-7)会被拆出来处理为2, 实际算式为3+2-5*2+6
     *    2. 该算式可以看做是四个分段的和:3, 2, -5*2, 6 (这些分段是以加减号分割的)
     *    3. 从左到右处理,当处理到减号时,减号之前的符号是加号,加号可分段(分段即表示两段结果互不影响),那么左边的3可以合并到result; +2同理
     *    4. 当处理到最后一个加号时,加号之前的符号是*号,该符号不分段,不用将-5合并到result,temp=temp*number=-5*2=-10;
     *    5. 处理到最后一位6时,加号,分段,将-10合并到result,最后一位6单独分一段;
     *    6. 将最后一个分段的结果合并到result,最终结果1.
     */
    private static int cal(String str) {
        if (str.length() == 0) return 0;
        char[] cs = str.toCharArray();
        char sign = '+';//sign表示上一个运算符,默认为+,表示0+
        int result = 0;//结果值,将每一段的结果合并(以加减分隔段)
        int temp = 0;//临时中间值,sign运算符左边的值
        int number = 0;//sign运算符右边的值
        for (int i = 0; i < cs.length; i++) {
            char c = cs[i];
            if (Character.isDigit(c)) {//字符串转数值
                number = number * 10 + c - '0';
            } else if (c == '(') {//去括号(将括号中的内容转成数值)
                int count = 1;
                int j = i;
                while (count > 0) {
                    j++;
                    if (cs[j] == ')') count--;
                    if (cs[j] == '(') count++;
                }
                number = cal(str.substring(i + 1, j));//将括号中的内容截取,j位置是一个")"
                i = j;
            }
            //每接收到一个新的运算符,都要处理sign运算符,最后一位时也要处理
            if (c == '+' || c == '-' || c == '*' || c == '/' || i == cs.length - 1) {
                if (sign == '+') {//前一个运算符为加号,那么sign运算符左边的数值可以直接合并到result
                    result += temp;
                    temp = number;//temp相当于栈顶,将number压入栈顶
                } else if (sign == '-') {//减号同加号
                    result += temp;
                    temp = -1 * number;
                } else if (sign == '*') {//前一个运算符为乘号,那么sign运算符左边的数值需要直接乘右边的值,还不能合并到result
                    temp *= number;
                } else if (sign == '/') {
                    temp /= number;
                }
                number = 0;//number置空,等待接收新值
                sign = c;//将新符号更新到sign
            }
        }
        result += temp;//将sign运算符右边的值也合并到result
        return result;
    }
}


发表于 2022-07-12 12:54:40 回复(0)

问题信息

难度:
63条回答 46034浏览

热门推荐

通过挑战的用户

查看代码