逆波兰计算器的Java实现

逆波兰计算器的Java实现

博主在学习尚硅谷的《数据结构与算法》课程时,觉得他们的视频有点老,故进行了一些代码的重构,使代码更简洁。

public class PolandNotation {
    public static void main(String[] args) {
        // 先定义一个逆波兰表达式
        // 为了方便,逆波兰表达式中数字和符号使用空格隔开
        String suffixExpression = "3 4 + 5 * 6 -";
        
        List<String> list = getListString(suffixExpression); // 获取用空格分隔的单个字符串列表
        System.out.println(list.toString()); // 输出(展示)列表
        
        int result = calculate(list); // 进行计算
        System.out.println(result); // 输出(展示)结果
    }

    // 对一个逆波兰表达式,一次将数据和运算符放入到ArrayList中
    public static List<String> getListString(String suffixExpression) {
        // 分割suffixExpression
        String[] split = suffixExpression.split(" ");
        
        // 以下有两种方式对尚硅谷视频中的代码做优化,但具体效果如何尚未知,欢迎讨论
        //return new ArrayList<>(Arrays.asList(split)); // new一个ArrayList作为返回值
        return Arrays.stream(split).collect(Collectors.toList()); // 使用java8的流将数组转换为列表
    }

    // 完成对逆波兰表达式地运算
    public static int calculate(List<String> list) {
        // 创建一个栈
        Stack<String> stack = new Stack<>();
        // 使用列表的forEach替代增强for循环对列表进行遍历
        list.forEach(element -> {
            if (element.matches("\\d+")) {
                stack.push(element);
            } else {
                int num2 = Integer.parseInt(stack.pop());
                int num1 = Integer.parseInt(stack.pop());
                // 使用java13的switch新特性直接进行赋值,消除了大量的if-else代码
                int result = switch (element) {
                    case "+" -> num1 + num2;
                    case "-" -> num1 - num2;
                    case "*" -> num1 * num2;
                    case "/" -> num1 / num2;
                    default -> throw new IllegalStateException("Unexpected value: " + element);
                };
                stack.push(String.valueOf(result));
            }
        });

        return Integer.parseInt(stack.pop());
    }
}

个人博客:https://tzq0301.github.io/

你可能感兴趣的:(java基础,算法,算法,数据结构,java,列表)