逆波兰表达式
逆波兰表达式又叫做后缀表达式。
逆波兰表达式,就是一种将平时我们所写的算术表达式(即中缀表达式)按照一定的规则进行转换后形成的一种表达式形式后编译计算机进行计算。
逆波兰表示式计算
步骤
- 输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果
- 支持小括号和多位数整数,因为主要是理解栈的数据结构以及基本应用,因此计算器进行简化,只支持对整数的计算。
思路
举例
中缀表达式:(3+4)×5-6 对应的后缀表达式就是34+5× 6 -,针对后缀表达式求值步骤如下:
- 从左至右扫描,将3和4压入堆栈;
- 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;3.将5入栈;
- 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;5.将6入栈;
- 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。
代码实现
package stack.ReverseCalc;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 逆波兰表达式(后缀表达式)实现计算器
*
*/
public class ReverseCalcTest {
public static void main(String[] args) {
//(3 * 4)* 5 + 6
String express = "3 4 + 5 * 6 -";
//表达式存入list中
//把list 配合stack完成计算
List<String> listString = getListString(express);
int res = cal(listString);
System.out.println("expression res:" + res);;
}
public static List<String> getListString(String expression){
//将表达式空格分割
String[] split = expression.split(" ");
List<String> list = new ArrayList<>();
for (String n : split){
list.add(n);
}
return list;
}
public static int cal(List<String> list){
//创建一个栈
Stack<String> stack = new Stack<>();
for (String item : list){
//使用正则表达式取出整数
if (item.matches("\\d+")){
//入栈
stack.push(item);
}else {//运算符
//出栈两个数,计算后,入栈
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("表达式运算符错误");
}
//结果入栈
stack.push(res + "");
}
}
//最后栈顶的元素就是最终的计算结果
return Integer.parseInt(stack.pop());
}
}
输出结果