后缀表达式对于人来说是比较难理解的,但是对于计算机来说,缺失比较简单易懂的结构,这主要是由于计算机内存是栈式结构。当我们知道一个表达式的后缀表达式的时候,可以通过栈很快的完成计算器功能。如下:
由上面的执行流程可以很快的分析出来后缀表达式的思路。
后缀表达式思路
代码实现
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 逆波兰表达式计算器
*/
public class PolandNotation {
public static void main(String[] args) {
//(3+4)×5-6的后缀表达式为304+5*6-
//如下使用空格将数字和符号用空格隔开 是为了计算过程中处理简便
String suffixExpression = "3 4 + 5 * 6 - ";
//将后缀表达式存储到ArrayList中
List<String> list = getListString(suffixExpression);
System.out.println(list);
int result = calculate(list);
System.out.println(result);
}
/**
* 将一个后缀表达式中的字符和数字 依次放入ArrayList中
* @param suffixExpression
* @return
*/
public static List<String> getListString(String suffixExpression){
//
String[] split = suffixExpression.split(" ");
List<String> list = new ArrayList<>();
for (String s : split){
list.add(s);
}
return list;
}
/**
* 完成后缀表达式的计算
* @param list
* @return
*/
public static int calculate(List<String> list){
//创建栈 用于存放数据
Stack<String> stack = new Stack<String>();
//对存入后缀表达式的ArrayList进行遍历
for (String item : list){
//如果是数字 则入栈
if(item.matches("\\d+")){//匹配数字
stack.push(item);//入栈
}else {//如果不是数字 则出栈两个数字 和当前符号进行计算 将计算结果入栈
int num1 = Integer.parseInt(stack.pop());
int num2 = Integer.parseInt(stack.pop());
int sum = 0;
if (item.equals("+")){
sum = num2 + num1;
}
if (item.equals("-")){
sum = num2 - num1;
}
if (item.equals("*")){
sum = num2 * num1;
}
if (item.equals("/")){
sum = num2 / num1;
}
stack.push(sum+"");
}
}
//栈中剩余的最后一个数组则为计算结果
return Integer.parseInt(stack.pop());
}
}