欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

逆波兰计算器的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