题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;

//中缀转后缀再计算
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String expression = sc.nextLine();
        System.out.println(eval(expression));
    }

    public static int eval(String expression){
        expression = expression.replace('[','(');
        expression = expression.replace(']',')');
        expression = expression.replace('{','(');
        expression = expression.replace('}',')');
        List<String> expressionList = parseToExpression(expression);
        List<String> postfixExpression = castToPostfixExpression(expressionList);
        return eval(postfixExpression);
    }
    public static int eval(List<String> postfixExpression){
        Stack<String> stack = new Stack<>();
        Set<String> sign = new HashSet<>();
        sign.add("+");
        sign.add("-");
        sign.add("*");
        sign.add("/");

        for (int i = 0; i < postfixExpression.size(); i++) {
            String s = postfixExpression.get(i);
            if(sign.contains(s)){
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                switch (s){
                    case "+":
                        stack.push(String.valueOf(num1+num2));
                        break;
                    case "-":
                        stack.push(String.valueOf(num1-num2));
                        break;
                    case "*":
                        stack.push(String.valueOf(num1*num2));
                        break;
                    case "/":
                        stack.push(String.valueOf(num1/num2));
                        break;
                }
            }else {
                stack.push(s);
            }
        }
        return Integer.parseInt(stack.lastElement());
    }

    public static List<String> castToPostfixExpression(List<String> infixExpression){
        Map<String,Integer> isp = new HashMap<>();
        Map<String,Integer> icp = new HashMap<>();
        initIspAndIcp(isp,icp);
        Stack<String> stack = new Stack<>();
        List<String> result = new ArrayList<>();
        stack.push("#");
        infixExpression.add("#");
        for (int i = 0; i < infixExpression.size(); i++) {
            String s = infixExpression.get(i);
            if(icp.containsKey(s)){
                while (icp.get(s)<=isp.get(stack.lastElement())){
                    if(icp.get(s)<isp.get(stack.lastElement())){
                        result.add(stack.pop());
                    }
                    if(icp.get(s) == isp.get(stack.lastElement())){
                        stack.pop();
                        break;
                    }
                }
                if(!s.equals(")")){
                    stack.push(s);
                }

            }else {
                result.add(s);
            }
        }
        return result;
    }

    public static List<String> parseToExpression(String expression){
        char[] chs = expression.toCharArray();
        List<String> stringList = new ArrayList<>();
        List<Character> numbers = new ArrayList<>();
        boolean digitFlag = false;

        for (int i = 0; i < chs.length; i++) {
            char temp = chs[i];

            if(Character.isDigit(temp)){
                if(!digitFlag){
                    digitFlag = true;
                }
                numbers.add(temp);
                if(i == chs.length-1){
                    digitFlag = false;
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < numbers.size(); j++) {
                        sb.append(numbers.get(j));
                    }
                    stringList.add(sb.toString());
                    numbers.clear();
                }
            }else{
                if(digitFlag){
                    digitFlag = false;
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < numbers.size(); j++) {
                        sb.append(numbers.get(j));
                    }
                    stringList.add(sb.toString());
                    numbers.clear();
                    stringList.add(String.valueOf(temp));
                    continue;
                }
                if(temp == '-'){
                    if((i-1>=0&&chs[i-1] == '(')||i == 0){
                        digitFlag = true;
                        numbers.add(temp);
                        continue ;
                    }
                }
                stringList.add(String.valueOf(temp));
            }
        }
        return stringList;
    }

    public static void initIspAndIcp(Map<String,Integer> isp,Map<String,Integer> icp){
        isp.put("#",0);
        isp.put("(",1);
        isp.put("+",3);
        isp.put("-",3);
        isp.put("*",5);
        isp.put("/",5);
        isp.put(")",6);

        icp.put("#",0);
        icp.put("(",6);
        icp.put("+",2);
        icp.put("-",2);
        icp.put("*",4);
        icp.put("/",4);
        icp.put(")",1);
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务