题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

中缀-后缀-计算后缀,注意一元减的情况 (@)

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

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        List<String> infix = new ArrayList<>();

        StringBuilder numberBuilder = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            if (Character.isDigit(ch)) {
                numberBuilder.append(ch);
            } else {
                if (numberBuilder.length() > 0) {
                    infix.add(numberBuilder.toString());
                    numberBuilder = new StringBuilder();
                }
                infix.add(ch + "");
            }
        }
        if (numberBuilder.length() > 0) {
            infix.add(numberBuilder.toString());
            numberBuilder = new StringBuilder();
        }

        // infix -> postfix
        List<String> postfix = new ArrayList<>();
        Stack<String> opStack = new Stack<>();
        List<String> order = new ArrayList<>();
        order.add("(");
        order.add("+");
        order.add("-");
        order.add("*");
        order.add("/");
        order.add("@");
        for (int i = 0; i < infix.size(); i++) {
            String part = infix.get(i);
            if (part.equals("+") || part.equals("-") || part.equals("*") ||
                    part.equals("/")) {
                if (part.equals("-")) {
                    if (i == 0) {
                        part = "@";
                    } else {
                        String last = infix.get(i - 1);
                        if (last.equals("+") || last.equals("-") || last.equals("*") ||
                                last.equals("/") || last.equals("(")) {
                            part = "@";
                        }
                    }
                }
                while (true) {
                    if (opStack.size() == 0) {
                        opStack.push(part);
                        break;
                    }
                    if (order.indexOf(part) > order.indexOf(opStack.peek())) {
                        opStack.push(part);
                        break;
                    }
                    String op = opStack.pop();
                    postfix.add(op);
                }
            } else if (part.equals("(")) {
                opStack.push(part);
            } else if (part.equals(")")) {
                do {
                    String op = opStack.peek();
                    if (op.equals("(")) {
                        opStack.pop();
                        break;
                    } else {
                        opStack.pop();
                        postfix.add(op);
                    }
                } while (true);
            } else {
                postfix.add(part);
            }
        }
        while (opStack.size() > 0) {
            String op = opStack.pop();
            postfix.add(op);
        }

        // postfix evaluate
        Stack<Integer> numberStack = new Stack<>();
        for (String part : postfix) {
            if (part.equals("-")) {
                int a = numberStack.pop();
                int b = numberStack.pop();
                numberStack.push(b - a);
            } else if (part.equals("+")) {
                int a = numberStack.pop();
                int b = numberStack.pop();
                numberStack.push(b + a);
            } else if (part.equals("*")) {
                int a = numberStack.pop();
                int b = numberStack.pop();
                numberStack.push(b * a);
            } else if (part.equals("/")) {
                int a = numberStack.pop();
                int b = numberStack.pop();
                numberStack.push(b / a);
            } else if (part.equals("@")) {
                int a = numberStack.pop();
                numberStack.push(-a);
            } else {
                numberStack.push(Integer.parseInt(part));
            }
        }
        System.out.println(numberStack.pop());
    }
}

全部评论

相关推荐

穿件外套出门:这简历一眼太水了,前面有的没的直接删,写项目亮点
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务