1.输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果
2.支持小括号和多位数整数。
3.思路分析
(3+4)5 -6对应的后缀表达式就是 3 4 + 5 * 6 -
1)从左至右扫描,将3和4压入堆栈
2)遇到+运算符,因此弹出4和3 ,计算出3+4的值,得到7,再将7入栈
3)遇到5入栈;
4)接下来是运算符,因此弹出5和7,计算出7* 5 = 35,将35入栈
5)将6入栈
6)最后是-运算符,计算出35-6的值,得出最终结果
package com.atguigu.stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
//先定义给逆波兰表达式
//(3+4)x 5 -6 => 3 4 + 5 x 6 -
//说明为了方便,逆波兰表达式的数字和符号使用空格隔开
String suffixExpression = "3 4 + 5 * 6 - ";
//思路
//1.先将"3 4 + 5 * 6 - " => 放到ArrayList中
//2.将ArrayList传递给一个方法,遍历ArrayList配合栈完成计算
List<String> rpnList = getListString(suffixExpression);
System.out.println("rpnList="+ rpnList);
int res = calculate(rpnList);
System.out.println("计算的结果是=" + res);
}
//将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中
public static List<String> getListString(String suffixexpression){
String[] split = suffixexpression.split(" ");
List<String> list = new ArrayList<String>();
for (String ele: split){
list.add(ele);
}
return list;
}
//完成对逆波兰表达式的运算
public static int calculate(List<String> ls){
//创建给栈,只需一个即可
Stack<String> stack = new Stack<String>();
//遍历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;