逆波兰计算器的Java编程实现
程序员文章站
2022-09-16 21:09:07
逆波兰计算器的Java实现博主在学习尚硅谷的《数据结构与算法》课程时,觉得他们的视频有点老,故进行了一些代码的重构,使代码更简洁。public class PolandNotation { public static void main(String[] args) { // 先定义一个逆波兰表达式 // 为了方便,逆波兰表达式中数字和符号使用空格隔开 String suffixExpression = "3 4 + 5 * 6 -";...
逆波兰计算器的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/
本文地址:https://blog.csdn.net/m0_46261993/article/details/107679072