学习尚硅谷韩顺平老师的Java数据结构笔记,详情请移步网站
完成一个逆波兰计算器,要求完成如下任务:
- 输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果
- 支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算。
- 思路分析
例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:
3.1 从左至右扫描,将 3 和 4 压入堆栈;
3.2 遇到+运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3+4 的值,得 7,再将 7 入栈;
3.3 将 5 入栈;
3.4 接下来是×运算符,因此弹出 5 和 7,计算出 7×5=35,将 35 入栈;
3.5 将 6 入栈;
3.6 最后是-运算符,计算出 35-6 的值,即 29,由此得出最终结果
package com.Stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 列表、栈实现逆波兰计算器
*/
public class PoLandNotation {
/**
* 先将"3 4 + 5 x 6 -"放到ArrayList中
* 将ArrayList传递给一个方法,遍历ArrayList配合栈完成计算
*/
public static void main(String[] args) {
//为了方便,逆波兰表达式的数字和符号使用空格隔开
String suffixExpression = "30 40 + 50 x 60 -";
System.out.println(suffixExpression + " = " + calculate(getListString(suffixExpression)));
}
/**
* 将逆波兰表达式分割放入到ArrayList中
* @param suffixExpression 逆波兰表达式
* @return 数组
*/
public static List<String> getListString(String suffixExpression){
//将suffixExpression分割
String[] split = suffixExpression.split(" ");
ArrayList<String> list = new ArrayList<>();
for (String str: split) {
list.add(str);
}
return list;
}
/**
* 完成对逆波兰表达式的运算
* 从左至右扫描,将30和40压入堆栈
* 遇到+运算符,因此弹出40和30(40为栈顶元素,30为次顶元素),计算出30+40的值,得70,再将70入栈
* 将50入栈
* 接下来是×运算符,因此弹出50和70,计算出70×50=3500,将3500入栈
* 将60入栈
* 最后是-运算符,计算出3500-60的值,即3440,由此得出最终结果
* @param list 传入逆波兰表达式的数组
* @return 结果
*/
public static int calculate(List<String> list){
//创建一个栈
Stack<String> stack = new Stack<>();
//遍历list
for (String item : list){
//使用正则表达式来取出数
if (item.matches("\\d+")){//匹配多位数
//入栈
stack.push(item);
}else {
//取出两个数,并运算,再入栈
int number2 = Integer.parseInt(stack.pop());
int number1 = Integer.parseInt(stack.pop());
if (item.equals("+")){
stack.push(String.valueOf(number1 + number2));
}else if (item.equals("-")){
stack.push(String.valueOf(number1 - number2));
}else if (item.equals("x")){
stack.push(String.valueOf(number1 * number2));
}else if(item.equals("/")){
stack.push(String.valueOf(number1 / number2));
}else {
throw new RuntimeException("运算符错误");
}
}
}
//返回栈顶
return Integer.parseInt(stack.pop());
}
}