验算逆波兰表达式是否正确
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());
}
}
这一路,灯火通明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现