2019计算机能力挑战赛Java题目5

题目

给定一个只包含0-9、+、*的合法数学表达式(长度<1000),规定加号‘+”的优先级高于乘号*”,请输出计算结果。输入说明:合法的数学表达式
输出说明:输出表达式的计算结果
输入样例:12*3+12*2输出样例:360

思路分析

本题本质上是一个简化版的四则运算问题。我们可以使用栈这一数据结构来解决。但是本题的难点是参与运算的数字并不只是10以内,这无疑加大了题目的难度。在本题中我使用StringBuffer来拼接字符串,将10以上的数字进行拼接处理。下面是解决本题的完整代码。

代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main14 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String string = scanner.nextLine();
        List<String> str = getTempStr(string);
        Integer result = getFinalResult(str);
        System.out.println(result);
        scanner.close();
    }

    /**
     * @MethodName: getFinalResult
     * @date: 2020/11/27 20:43
     * @author 索半斤
     * @Description: 根据后缀表达式获取算式的最终结果
     * 转换过程为:
     *          1、遍历后缀表达式,如果为数字则入栈
     *          2、如果为符号则将栈顶的两个元素出栈并进行操作
     *          3、将2中的计算结果入栈
     */
    private static Integer getFinalResult(List<String> list) {
        Stack<Integer> stack = new Stack<>();
        for (String s : list) {
            if (isNum(s) || s.length() > 1){
                stack.push(stringToInteger(s));
            }else {
                if (s.equals("+")) {
                    Integer  num1 = stack.pop();
                    Integer  num2 = stack.pop();
                    stack.push(num1 + num2);
                } else if (s.equals("*")) {
                    Integer num1 = stack.pop();
                    Integer num2 = stack.pop();
                    stack.push(num1 * num2);
                }
            }
        }
        return stack.pop();
    }

    private static Integer stringToInteger(String s){
        return Integer.parseInt(s);
    }
    /**
     * @MethodName: getTempStr
     * @date: 2020/11/27 20:20
     * @author 索半斤
     * @Description: 将中缀表达式转换为后缀表达式
     * 转换过程:
     *         1、遍历字符串,判断是否为数字
     *         2、如果为数字直接存入List中
     *         3、如果为符号则判断优先级,栈为空时无论任何符号都直接入栈
     *         4、当栈不为空时,如果栈中的元素优先级较高则栈中符号出栈,并将此时的符号入栈
     *         5、最后遍历栈,将余下的符号依次出栈
     */
    private static List<String> getTempStr(String string){
        Stack<String> stack = new Stack<>();
        List<String> list = new ArrayList<>(); //存放后缀表达式
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < string.length(); i++) {
            String temp = string.substring(i,i+1);
            if (i == string.length() - 1 && isNum(temp)){
                list.add(temp);
                continue;
            }
            if (isNum(temp)){
                sb.append(temp);
            }else{
                if (sb.length() > 0){
                    list.add(sb.toString());
                    sb = new StringBuffer();
                }
                if (temp.equals("*")){
                    if (stack.isEmpty()){
                        stack.push("*");
                    }else {
                        String peek = stack.peek();
                        if (peek.equals("+")) {
                            list.add(stack.pop());
                            stack.push("*");
                        } else {
                            stack.push(temp);
                        }
                    }
                } else if (temp.equals("+")){
                   stack.push("+");
                }
            }
        }
        while(!stack.isEmpty()){
            list.add(stack.pop());
        }
        return list;
    }

    /**
     * @MethodName: isNum
     * @date: 2020/11/27 20:49
     * @author 索半斤
     * @Description: 判断字符串是否是0-9的整数
     */
    private static boolean isNum(String string){
        return string.matches("[0-9]");
    }
}
原文地址:https://www.cnblogs.com/zwscode/p/14284086.html