1、逆波兰规则,遇到符号,就先弹出两个数值进行运算
2、用正则表达式进行匹配多位数
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args){
// 定义一个逆波兰表达式
String suffixExpression = "1 2 3 + 4 * + 5 - ";
// 思路
// 1.先将"3 4 + 5 * 6 -" 放到ArrayList中
// 2 将ArrayList 传递一个方法,遍历ArrayList配合栈,完成计算
List<String> rpnList = getListString(suffixExpression);
// System.out.println(rpnList);
int res = calculate(rpnList);
System.out.println("结果为:"+res);
}
// 将一个逆波兰表达式,依次将数据放到ArrayList中
public static List<String> getListString(String suffixExpression){
// 将suffixExpression 分割
String[] split = suffixExpression.split(" ");
List<String> list = new ArrayList<>();
for (String ele: split
) {
list.add(ele);
}
return list;
}
// 完成对逆波兰表达式的运算
/*
次栈顶 符号 栈顶
1从左向右扫描,将3和4压入栈中
2遇到+,因此弹出3和4 ,计算3+4 的值 》7 将7 压入栈中
3将5压入栈中
4 * 运算符,因此弹出5 和7 ,极端5*7 的结果》35 将35压入栈中
5 将6入栈
6最后是-,计算出35-6的值,即29 得到最后结果
*/
public static int calculate(List<String> ls){
// 创建栈,只需要一个栈
Stack<String> stack = new Stack<>();
//遍历ls
for(String item:ls){
//这里使用正则表达式
if(item.matches("\\d+")){
// 匹配多位数
stack.push(item);
}else{
//pop出两个数,并运算,再入栈
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
int res = 0;
if(item.equals("+")){
res = num1+num2;
} else if (item.equals("-")) {
res = num1-num2;
}else if(item.equals("*")){
res = num1*num2;
}else if(item.equals("/")){
res = num1/num2;
}else if(item.equals("%")){
res = num1%num2;
}
else{
}
stack.push(""+res);
}
}
// 最后一个为结果
return Integer.parseInt(stack.pop());
}
public static String getString(String s){
return s;
}
}