1 需求:
1).输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果。
2)这里我们只支持整数。
2 思路分析:
例如:(3+4)*5-6 对应的后缀表达式为 3 4 + 5 * 6 - ,针对后缀表达式求值步骤如下:
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 ,由此得出最终结果。
3 . 代码实现
package Stack.Calculator;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
//先给波兰表达式定义,为了说明方面,逆波兰表达式的数字和符号用空格隔开
String suffixExpression="3 4 + 5 * 6 -";
//分析
//1 . 先将"3 4 + 5 * 6 - 放到ArrayList中
//2 在将ArrayList传递给一个方法,遍历ArrayList 配合栈,完成计算
List<String> list = getListString(suffixExpression);
System.out.println(list);
int i = calculate(list);
System.out.println("运算结果为:"+i);
}
//将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中
public static List<String> getListString(String suffixExpression){
//将suffixExpression分割,使用空格进行分割
String[] split = suffixExpression.split(" ");
//创建一个集合来存储
List<String> list=new ArrayList<>();
for (String s : split) {
list.add(s);
}
return list;
}
//完成对逆波兰表达式的运算
public static int calculate(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;
if(s.equals("+")){
res=num1+num2;
}
if(s.equals("-")){
res=num1-num2;
}
if(s.equals("/")){
res=num1/num2;
}
if(s.equals("*")){
res=num1*num2;
}else {
System.out.println("运算符有误");
}
//把res入栈,因为此时res为正数,需要变成字符类型的
stack.push(""+res);
}
}
//最后留在stack中的数据是运算结果
return Integer.parseInt(stack.pop());
}
}