1.代码
1.PolandNotation
package com.example.lib5.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
//将表达式(3+4)*5-6转为逆波兰表达式,如下,计算结果为29
String suffixExpression = "30 4 + 5 * 6 -";
//将逆波兰表达式加入到ArrayList中
List<String> list = getListString(suffixExpression);
//根据list来获取结果
int calculate = getCalculate(list);
System.out.println("计算结果为:"+calculate);
}
private static List<String> getListString(String suffixExpression) {
List<String> list = new ArrayList<>();
//对字符串进行分割
String[] s = suffixExpression.split(" ");
//遍历字符串数组,加入到list中
for (String value : s) {
list.add(value);
}
return list;
}
private static int getCalculate(List<String> list) {
//创建一个String类型的栈
Stack<String> stack = new Stack<>();
//根据是否为数字对list进行遍历,压入到栈中
for (String s : list) {
if (s.matches("\\d+")) {//匹配为多位数
//如果为数字的话,就直接加入到栈中
stack.push(s);
} else {//如果不是的话,取出栈两个值,然后跟这个符号进行计算,压入到栈
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
int res = 0;
if (s.equals("+")) {
res = num2 + num1;
} else if (s.equals("-")) {
res = num2 - num1;
} else if (s.equals("*")) {
res = num2 * num1;
} else if (s.equals("/")) {
res = num2 / num1;
}else {
throw new RuntimeException("运算符有错");
}
//把res入栈
stack.push(String.valueOf(res));
}
}
return Integer.parseInt(stack.pop());
}
}
2.介绍
1.前缀表达式,计算机的计算方法,计算机是从右向左计算
- 6 * 5 + 4 30
2.中缀表达式,就是我们认识的表达式
(3+4)*5-6
3.后缀表达式,便于理解的计算方法,也比较方便。与前缀表达式发过来
30 4 + 5 * 6 -
4.逆波兰表达式实现计算器
- 将中缀表达式(就是我们熟知的表达式)转为后缀表达式
- 将将后缀表达式加入到list中,便于取出于格式化
- 创建栈,根据list遍历的类型来压入栈。如果是数字的话,就直接压入栈,如果不是的话,就取出栈的两个值,然后根据符号来计算,将计算结果压入到栈。最后栈会只剩下一个值,就是计算结果