栈的简单应用(利用Stack进行四则混合运算)(JAVA)

简介: 中缀表达式转后缀表达式图解,代码实现过程,完整代码,利用后缀表达式求值,完整代码

首先我们得先了解逆波兰表达式

中缀表达式转后缀表达式

所谓的中缀表达式其实就是我们平时写的例如:;而它的后缀表达式(也成为逆波兰表达式)

后缀表达式:指的是不包含括号运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行不再考虑运算符的优先规则)。

我们如果要利用程序来进行四则混合运算最重要的就是将输入的中缀表达式转后缀表达式

首先我们假设运算符中只有 加 减 乘 除 和 括号不然的话程序太复杂了。

图解

c2awgdfvou5n4_a4b2749a43604c78abbf12a146c03c79.png

代码实现过程:

首先我们先写一个方法 返回值是动态字符串数组(为了后面好计算),形参为字符串类型(因为输入值不只有数字还有运算符)。这里会用到栈所以也定义一个栈。

publicArrayList<String>midChangeEng(Stringstr) {
//这里用动态数组就不用担心不够用ArrayList<String>ret=newArrayList<String>();
Stack<Character>stack=newStack<>();
    }

image.gif

此时再创建一个新方法用来判断传入字符是不是运算符

publicbooleanisOperator(chars) {
if (s=='+'||s=='-'||s=='*'||s=='/'||s=='('||s==')') {
returntrue;
        }
returnfalse;
    }

image.gif

我们再利用运算符再ASCII码中的位置,创建一个数组用来表示它们的优先级

image.png

int[] able= {1,0,0,0,0,1};//分别代表 * + (null) - (null) / 的优先级

image.gif

利用循环遍历字符串

//遍历字符串for (inti=0; i<str.length(); i++) {
chara=str.charAt(i);
Stringtmp="";//用来暂时存储出栈的数字if (isOperator(a)) {
//是操作数            }else{
//如果是数字就放到ret中            }
        }
returnret;

image.gif

对操作数的操作 ,可是此段代码中重复代码过多,所以可以将其封装成一个方法。

if (isOperator(a)) {
//是操作数switch (a) {
case'+'://判断如果优先级不大于栈顶的元素那么就先出栈在入栈if(!stack.isEmpty()) {//出栈while(!stack.isEmpty() &&stack.peek() !='('&&able[(int)stack.peek() -42] >=able[(int)a-42]) {
Stringb="";
b+=stack.pop();
ret.add(b);
                            }
                        }
stack.push(a);
break;
case'-':
if(!stack.isEmpty()) {//出栈while(!stack.isEmpty() &&stack.peek() !='('&&able[(int)stack.peek() -42] >=able[(int)a-42]) {
Stringb="";
b+=stack.pop();
ret.add(b);
                            }
                        }
stack.push(a);
break;
case'*':
if(!stack.isEmpty()) {//出栈while(!stack.isEmpty() &&stack.peek() !='('&&able[(int)stack.peek() -42] >=able[(int)a-42]) {
Stringb="";
b+=stack.pop();
ret.add(b);
                            }
                        }
stack.push(a);
break;
case'/':
if(!stack.isEmpty()) {//出栈while(!stack.isEmpty() &&stack.peek() !='('&&able[(int)stack.peek() -42] >=able[(int)a-42]) {
Stringb="";
b+=stack.pop();
ret.add(b);
                            }
                        }
stack.push(a);
break;
case'(':
stack.push(a);
break;
case')':
while(!stack.isEmpty() &&stack.peek() !='(') {
Stringb="";
b+=stack.pop();
ret.add(b);
                        }
stack.pop();//删除‘(’break;
                }
            }

image.gif

如果是数字就进行以下操作

else{
//如果是数字就放到ret中Stringtmp="";
while(i<str.length() &&!isOperator(str.charAt(i))) {//数字有可能是多位的tmp+=str.charAt(i);
i++;
                }
i--;
ret.add(tmp);
            }

image.gif

再出函数之前要先将栈里面的全部导出来

//将栈里面剩余的全部出栈while(!stack.isEmpty()) {
Stringb="";
b+=stack.pop();
ret.add(b);
        }
returnret;

image.gif

完整代码:

publicstaticArrayList<String>midChangeEng(Stringstr) {
//这里用动态数组就不用担心不够用ArrayList<String>ret=newArrayList<String>();
Stack<Character>stack=newStack<>();
int[] able= {1,0,0,0,0,1};//分别代表 * + (null) - (null) / 的优先级//遍历字符串for (inti=0; i<str.length(); i++) {
chara=str.charAt(i);
if (isOperator(a)) {
//是操作数switch (a) {
case'+'://判断如果优先级不大于栈顶的元素那么就先出栈在入栈abcd(ret, stack, able, a);
break;
case'-':
abcd(ret, stack, able, a);
break;
case'*':
abcd(ret, stack, able, a);
break;
case'/':
abcd(ret, stack, able, a);
break;
case'(':
stack.push(a);
break;
case')':
while(!stack.isEmpty() &&stack.peek() !='(') {
Stringb="";
b+=stack.pop();
ret.add(b);
                        }
stack.pop();//删除‘(’break;
                }
            }else{
//如果是数字就放到ret中Stringtmp="";
while(i<str.length() &&!isOperator(str.charAt(i))) {//数字有可能是多位的tmp+=str.charAt(i);
i++;
                }
i--;
ret.add(tmp);
            }
        }
//将栈里面剩余的全部出栈while(!stack.isEmpty()) {
Stringb="";
b+=stack.pop();
ret.add(b);
        }
returnret;
    }

image.gif

image.png

利用后缀表达式求值:


这部分比较简单所以就直接展示了

image.png

完整代码:

publicintevalRPN(String[] tokens) {
Stack<Integer>stack=newStack<>();
for (inti=0; i<tokens.length; i++) {
if (isOperator(tokens[i])) {
intnum2=stack.pop();
intnum1=stack.pop();
switch(tokens[i].charAt(0)) {
case'+':
stack.push(num1+num2);
break;
case'-':
stack.push(num1-num2);
break;
case'*':
stack.push(num1*num2);
break;
case'/':
stack.push(num1/num2);
break;
                    }
                }else {
stack.push(Integer.parseInt(tokens[i]));
                }
            }
returnstack.pop();
        }
publicbooleanisOperator(Stringstr) {
if (str.length() !=1) {
returnfalse;
            }
if (str.charAt(0) =='+'||str.charAt(0) =='-'||str.charAt(0) =='*'||str.charAt(0) =='/') {
returntrue;
            }
returnfalse;
        }

image.gif


目录
打赏
0
0
0
0
5
分享
相关文章
|
18天前
|
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
32 2
JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南
本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。
111 5
Java 大数据在智能教育在线实验室设备管理与实验资源优化配置中的应用实践
本文探讨Java大数据技术在智能教育在线实验室设备管理与资源优化中的应用。通过统一接入异构设备、构建四层实时处理管道及安全防护双体系,显著提升设备利用率与实验效率。某“双一流”高校实践显示,设备利用率从41%升至89%,等待时间缩短78%。该方案降低管理成本,为教育数字化转型提供技术支持。
41 0
Java 大视界 -- 基于 Java 的大数据可视化在城市地下管网管理与风险预警中的应用(275)
本文系统阐述 Java 与大数据可视化技术在城市地下管网管理中的应用,涵盖数据采集、三维建模、风险预警及性能优化,结合真实案例提供可落地的技术方案。
Java 大视界 -- Java 大数据在智能教育学习社区用户互动分析与社区活跃度提升中的应用(274)
本文系统阐述 Java 大数据技术在智能教育学习社区中的深度应用,涵盖数据采集架构、核心分析算法、活跃度提升策略及前沿技术探索,为教育数字化转型提供完整技术解决方案。
|
20天前
|
Java 17 + 特性与现代开发技术实操应用详解
本指南聚焦Java 17+最新技术,涵盖模块化开发、Record类、模式匹配、文本块、Stream API增强、虚拟线程等核心特性,结合Spring Boot 3与Micronaut框架实战。通过实操案例解析现代Java开发技术栈,包括高性能并发编程、GraalVM原生编译及开发工具链配置。同时梳理面试高频考点,助力掌握Java新特性和实际应用,适合学习与项目实践。代码示例丰富,附带完整资源下载链接。
245 0
|
22天前
|
Java最新技术(JDK 11+) 及以上 Java 最新技术之集合框架实操应用详解
本示例基于Java最新技术(JDK 11+),涵盖集合框架的核心功能,结合Java 8+特性(如Stream API、Lambda表达式)与并发编程最佳实践。内容包括:List操作(初始化、Lambda过滤、Stream处理)、Map操作(流式过滤、ConcurrentHashMap原子操作、并行流)、Set操作(TreeSet排序、CopyOnWriteArraySet并发安全)、Queue/Deque操作(优先队列、双端队列)以及高级聚合操作(集合转换、分组统计、平均值计算)。 [代码下载](https://pan.quark.cn/s/14fcf913bae6)
37 4
Java 基础篇必背综合知识点最新技术与实操应用全面总结指南
本总结梳理了Java 17+的核心知识点与新技术,涵盖基础概念(模块化系统、GraalVM)、数据类型(文本块、模式匹配)、流程控制(增强switch)、面向对象(Record类、密封类)、常用类库(Stream API、HttpClient)、实战案例(文件处理)、构建工具(Maven、Gradle)、测试框架(JUnit 5)、开发工具(IDE、Git)及云原生开发(Spring Boot 3、Docker)。通过理论结合实操,帮助开发者掌握Java最新特性并应用于项目中。代码示例丰富,建议配合实践加深理解。
61 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问