逆波兰表达式计算
package com.atchina.stack;
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 x 6 - "放到arraylist中
List<String> rpnList = getListString(suffixExpression);
System.out.println(rpnList);
int res = calculate(rpnList);
System.out.println(res);
System.out.println("hello world");
}
// 将一个逆波兰表达式,依次将数据和运算符放入到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 "3 4 + 5 * 6 - "
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;
if (item.equals("+")) {
res = num1 + num2;
} else if (item.equals("-")) {
res = num1 - num2;
} else if (item.equals("*")) {
res = num1 * num2;
} else if (item.equals("/")) {
res = num1 / num2;
} else {
throw new RuntimeException("运算符有误");
}
// 把res入栈
stack.push(res + "");
}
}
return Integer.parseInt(stack.pop());
}
}
中缀表达式转后缀表达式的思路步骤分析