首页 > 技术文章 > 验算逆波兰表达式是否正确

zhumenglong 2021-07-26 16:01 原文

package A;

import java.util.ArrayList;
//此程序你可以验算你的逆波兰表达式有没有写对
//4*5-8+60+8/2=4 5 * 8 - 60 + 8 2 / +
//其实逆波兰表达式并不难,也是由我们常用的中缀表达式转换来的,仔细写一下就知道了
public class JosePhu {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack();
//(3+4)*5-6=29
String suffixExpression="30 4 + 5 * 6 - ";//在这里可以输入你想要验算的逆波兰表达式,并用空格隔开
ArrayList<String> list=arrayStack.getListString(suffixExpression);
System.out.println("list="+list);
int res=arrayStack.calculate(list);
System.out.println("计算的结果是="+res);
}
}

package A;

import java.util.ArrayList;
import java.util.Stack;

public class ArrayStack {
//将suffixExpression分割,然后放入动态数组
public ArrayList<String> getListString(String suffixExpression){
//将suffixExpression按空格分割成一段一段的数组,类型是String
//其实这里分割的很巧妙,不论是10,还是1000,反正都是作为数组中的一个值,就解决了那种只检测一位的问题
String[] spilt=suffixExpression.split(" ");
ArrayList<String> list=new ArrayList<>();
//有for的地方必定是循环,所以这里是对spilt进行循环,把它给加到list里面去
for (String ele:spilt){
list.add(ele);
}
return list;
}
//对逆波兰表达式进行计算
public int calculate(ArrayList<String> ls){
Stack<String> stack=new Stack<>();
for (String item:ls){
//正则表达式,如果item匹配的是多位数,是一个类似于123的数字,那么直接入栈
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());
}
}

推荐阅读