栈-逆波兰计算器
思路
前缀表达式也叫波兰表达式
后缀表达式也叫逆波兰表达式
下面完成该项任务~
package datastructres.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* @author :Yan Guang
* @date :Created in 2021/1/12 9:12
* @description:
*/
public class PolandNotation {
public static void main(String[] args){
//首先定义一个后缀表达式suffix是后缀的意思
String suffixExpression = "3 4 + 5 * 6 -";
List<String> list = getListString(suffixExpression);
int res = 0;
try {
res = calculator(list);
} catch (Exception e) {
e.getMessage();
}
System.out.println(res);
}
//首先先把数据都存放到一个list里面去
public static List<String> getListString(String suffixExpression){
//将字符串通过什么隔开~
String[] list = suffixExpression.split(" ");
ArrayList<String> strings = new ArrayList<>();
for (String c : list) {
strings.add(c);
}
return strings;
}
/* 1)从左至右扫描,将3和4压入堆栈;
2)遇到+运算符,因此弹出4和3 (4为栈顶元素,3为次顶元素) ,计算出3+4的值,得7,再将7入栈;
3)将5入栈;
4)接下来是x运算符,因此弹出5和7,计算出7x5=35,将35入栈;
5)将6入栈;
6)最后是-运算符,计算出35-6的值,即29,由此得出最终结果*/
public static int calculator(List<String> list){
Stack<String> stack = new Stack<>();
for (String data : list) {
//这里用正则判断是否为一个数,多位数都可以
if (data.matches("\\d+")){
stack.push(data);
}else{
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
int res=0;
if (data.equals("+")){
res=num1+num2;
}else if(data.equals("-")){
res=num1-num2;
}else if(data.equals("*")){
res = num1*num2;
}else if (data.equals("/")){
res = num1/num2;
}else{
throw new RuntimeException("程序符号错误~");
}
stack.push(""+res);
}
}
return Integer.parseInt(stack.pop());
}
}
兄弟们搞完收工,不难~