4.4.4 逆波兰计算器
1、输入一个逆波兰表达式(后缀表达式),使用栈,计算其结果
2、支持小括号和多位数整数
3、思路分析
4、代码g)]
package com.ldm.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* @author 梁东明
* 2022/8/24
* 86139
* 点击setting在Editor 的File and Code Templates 修改
*/
public class PolandNotation {
public static void main(String[] args) {
//先定义给逆波兰表达式
//(30+4)×5-6 => 30 4 + 5 × 6 - => 164
// 4 * 5 - 8 + 60 + 8 / 2 => 4 5 * 8 - 60 + 8 2 / +
//测试
//说明为了方便,逆波兰表达式 的数字和符号使用空格隔开
//String suffixExpression = "3 4 + 5 * 6 -" ==29;
//String suffixExpression = "4 5 * 8 - 60 + 8 2 / +"; // 76
//思路
//1. 先将 "3 4 + 5 × 6 - " => 放到ArrayList中
//2. 将 ArrayList 传递给一个方法,遍历 ArrayList 配合栈 完成计算
String suffixExpression = "30 4 + 5 * 6 -";
List<String> list = getListString(suffixExpression);
System.out.println("rpnList=" + list);
int res = calculator(list);
System.out.println("res = " + res);
}
public static List<String > getListString(String suffixExpression){
//将表达式分割
String[] s = suffixExpression.split(" ");
List<String> list = new ArrayList<>();
for (String data : s) {
list.add(data);
}
return list;
}
//完成对逆波兰表达式的运算
/*
* 1)从左至右扫描,将3和4压入堆栈;
2)遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;
3)将5入栈;
4)接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;
5)将6入栈;
6)最后是-运算符,计算出35-6的值,即29,由此得出最终结果
*/
public static int calculator(List<String> ls){
//创建栈,只需要一个栈即可
Stack<String> stack = new Stack<>();
//遍历 ls
for (String item : ls) {
//使用正则表达式取出数来
if ( item.matches("\\d+")){ //匹配的是多位数
//入栈
stack.push(item);
}else {
//pop出两个数,并运算,在入栈
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
int res = 0;
if (item.equals("+")){
res = num1 + num2;
}else if (item.equals("-")){
res = num2 - num1;
}else if (item.equals("*")){
res = num1 * num2;
}else if (item.equals("/")){
res = num2 / num2 ;
}else {
throw new RuntimeException("没有这种运算符");
}
//把res入栈
stack.push(""+ res );
}
}
//最后留在栈中的值就是运算得到的值
return Integer.parseInt(stack.pop());
}
}
最后,认识一下,我是小白。努力成为一名合格的程序员。期待与你的下次相遇。