package com.ffyc.util;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 辨析我们的逆波兰计算器类
*/
public class PolandNotation {
/**
* 别写一个方法,将一个后缀表达式(逆波兰表达式)中的数据和运算符依次放到一个ArrayList实例中
*/
public static List<String> getListString(String suffixExpression){
//将sufflxExpression使用空格进行一个分割
String [] split = suffixExpression.split(" ");
//创建一个ArrayList实例,将我们的后缀表达式中的数据装入我们的List对象中,并将这个ArrayList对象返回
List<String> list = new ArrayList<>();
for (String s:
split) {
list.add(s);
}
//将我们的ArrayList实例返回
return list;
}
//计算后缀表达式值的方法
public static int calculator(List<String> list){
//创建一个栈,只需要一个栈就可以了
Stack<String> stack = new Stack<>();
//遍历list集合,进行后缀表达式的计算
for (String s:
list) {
//这里我们使用正则表达式来判断是否为多位数
if(s.matches("\\d+")) { //匹配的是多位数
//如果是数值就直接入栈
stack.push(s);
}else{
//如果是运算符我们就要从栈顶pop出两个数(进行一个对应的运算),记得运算之后我们要将运算结果入栈
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
//创建一个临时变量用来存储运算结果
int res = 0;
switch(s){
case "+" :
res = num1 + num2;
break;
case "-" :
res = num1 - num2;
break;
case "*" :
res = num1 * num2;
break;
case "/" :
res = num1 / num2;
break;
default:
System.out.println("没有此操作符");
break;
}
//记得要将运算结果入栈
stack.push(res+""); //使用基本数据类型的值+一个""空字符串就可以将一个数值直接转换为一个对应的字符串
}
}
//最后留在stack(栈)中的数据就是运算结果
return Integer.parseInt(stack.peek());
}
//编写一个测试方法:
public static void main(String[] args) {
//定义一个后缀表达式
//中缀表达式: (3 + 4) * 5 - 6 转化为后缀表达式: 3 4 + 5 * 6 -
String suffix = "3 4 + 5 * 6 -";
//这里是对我们的将后缀表达式放到ArrayList实例中的方法进行的一个测试
List<String> listString = getListString(suffix);
System.out.println(listString);
//对我们的存放后缀表达式的List对象中的后缀表达式进行一个计算
int calculator = calculator(listString);
System.out.println("rpnList = " + calculator);
//我们测试之后可以发现测试的结果是没有问题的
}
}
使用+(加号,也即是拼接符)将一个基本类型的数据和一个""空字符串拼接到一起就可以将一个数值直接转换为一个对应的字符串