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