要求完成一个逆波兰计算器 1.输入一个逆波兰表达式(后缀表达式),使用栈计算其结果 2.支持小括号和多为数整数
如 (3+4)*5-6
的逆波兰表达式为3 4 + 5 x 6 -
1.将表达式 3 4 + 5 x 6 -
放到ArrayList中(方便遍历)
2.将ArrayList传递给一个方法,用于计算
3.拿到ArrayList后,从左至右开始遍历,遇到数字直接压入栈
4.遇到运算符,弹出栈顶和次顶的元素,进行计算,将得到的结果再次放入栈中
5.一直重复,直到ArrayList遍历完毕,可得到最终结果
public class Polanexpr{
public static void main(String[] args) {
String expr = "3 4 + 5 * 6 - "; //逆波兰表达式 (3+4)*5-6
List<String> listString = getListString(expr); //将逆波兰表达式转换为List
int res = cale(listString);
System.out.println(res);
}
//将逆波兰表达式转换为list
public static List<String> getListString(String expr){
//将表达式分割成数组
String[] split = expr.split(" ");
List<String> list = new ArrayList<String>();
for(String ele: split){
list.add(ele);
}
return list;
}
//表达式计算
public static int cale(List<String> ls){
Stack<String> stack = new Stack<String>();
//遍历 ls
for(String item: ls){
//使用正则匹配数值
if(item.matches("\\d+")){
//数值直接入栈
stack.push(item);
}else{
//如果是运算符则需在栈中弹出两个数,进行运算
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
int res = 0;
switch (item){
case "+":
res = num1 + num2;
break;
case "-":
res = num2 - num1;
break;
case "*":
res = num1 * num2;
break;
case "/":
res = num2 / num1;
break;
default:
break;
}
//运算的结果压入栈中
stack.push(res+"");
}
}
//最后留在栈中的元素即为结果
return Integer.parseInt(stack.pop());
}
}