数据结构与算法——Java实现 24.中缀表达式转后缀

目录

中缀表达式转后缀表达式

引言

思路

代码


正因为我有能力跨越,考验才会降临

                                                —— 24.9.28

中缀表达式转后缀表达式

引言

Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式,然后编译好输出程序

思路

遍历中缀表达式,如果遇上了变量,则将其加入后缀表达式中,如果遇上了符号,将其加入栈内,当再次遇到符号时遍历暂停,比较新符号与栈中符号的优先级,若新符号优先级大于旧符号,则新符号也入栈,若新符号优先级小于等于旧符号,则旧符号出栈进行运算,从栈中取出之前存入的符号与之前得到的字符进行运算

        a+b ——> ab+

        a*b+c ——> ab*c+

        a+b*c ——> abc*+

        a+b*c-d ——> abc*+d-

        (a+b)*c ——> ab+c*

        (a+b*c-d)*e ——> abc*+d-e*

        a*(b+c) ——> abc+*

左括号直接入栈,左括号优先级设置为0

右括号就把栈里直到左括号为止的所有运算符出栈,左括号也出栈

遇到非运算符,直接拼接到串后

遇到+ - * / 

        ① 若优先级高于栈顶运算符,入栈

        ② 若优先级低于栈顶运算符,将优先级 >= 栈内运算符都出栈进行运算,它再入栈

        ③ 遍历完成后,栈里剩余的运算符依次出栈,拼接到串尾部

代码

import java.util.LinkedList;public class InfixToSuffix {// 返回某符号的计算优先级static int priority(char c){return switch (c){case '*', '/' -> 2;case '+', '-' -> 1;case '(' -> 0;default -> throw new IllegalArgumentException("不合法的运算符");};}static String infixToSuffix(String exp){LinkedList<Character> stack = new LinkedList<>();// 用StringBuilder字符串拼接StringBuilder sb = new StringBuilder(exp.length());for (int i = 0; i < exp.length(); i++) {char c = exp.charAt(i);switch (c){case '+', '-', '*', '/' -> {if (stack.isEmpty()){stack.push(c);}else {if(priority(c) > priority(stack.peek())){stack.push(c);}else {while (!stack.isEmpty() && priority(stack.peek()) >= priority(c)){sb.append(stack.pop());}stack.push(c);}}}case '(' -> stack.push(c);case ')' -> {try {stack.pop();} catch (Exception e) {while (!stack.isEmpty() && stack.peek() != '('){sb.append(stack.pop());}stack.pop();}}default -> {sb.append(c);}}}while (!stack.isEmpty()){sb.append(stack.pop());}return sb.toString();}public static void main(String[] args) {System.out.println(infixToSuffix("a+b"));System.out.println(infixToSuffix("a+b-c"));System.out.println(infixToSuffix("a+b+c"));System.out.println(infixToSuffix("a*b+c"));System.out.println(infixToSuffix("a*b*c"));System.out.println(infixToSuffix("(a+b)*c"));System.out.println(infixToSuffix("a+b*c+(d*e+f)*g"));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaweb之会话管理

Cookie&#xff1a; 1. Cookie 的定义 Cookie 是存储在用户浏览器中的小块数据&#xff0c;通常由服务器发送并存储&#xff0c;以便在用户浏览器和服务器之间保持会话状态。每次用户发送请求时&#xff0c;浏览器都会自动附带相应的 Cookie&#xff0c;允许服务器辨识用户。…

亚信安慧AntDB基于操作符的隐式转换

背景 在新一代信息技术创新应用的大背景下&#xff0c;为了降低用户使用成本、加快改造速度&#xff0c;很多数据库产品都在做Oracle兼容性适配。AntDB作为一款成熟、稳定的国产数据库&#xff0c;高度兼容Oracle语法。本文将主要介绍AntDB数据库基于操作符的隐式转换及其设计…

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…

基于SpringBoot的新冠检测信息管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 国内外在该方向的研究现状及分析 新型冠状病毒肺炎疫情发生以来&#xff0c;中国政府采取积极的防控策略和措施&#xff0c;经过两个多月的不懈努力&#xff0c;有效控制了新发病例的増长&#xff0c;本地传播已经趋于完全控制…

spark 大表与大表join时的Shuffle机制和过程

在 Spark 中&#xff0c;当处理大表与大表的 JOIN 操作时&#xff0c;通常会涉及到 Shuffle 机制&#xff0c;这是分布式计算中用于重新分布数据的关键步骤。Shuffle 的本质是将数据按照某种方式重新分组&#xff0c;使得相同 key 的数据能够被发送到同一个计算节点进行后续的操…

PostgreSQL查询库所有表和指定表结构(CLI)

查看所有表 \dt查看表结构 \d <指定表名>

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术&#xff0c;属于 Elastic 技术栈的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索。Logstash/Beats&#xff1a;用于数据收集。Kib…

nodejs 016: javascript语法——解构赋值({ a, b, c } = {})=>{console.log(“Hello“);}

在 JavaScript 中&#xff0c;函数参数 { a, b, c } {} 的含义是在函数定义时提供一个默认的对象参数。这个对象包含了三个可选的属性 a, b, 和 c。如果没有传递参数或者传递的参数是一个非对象类型的值&#xff0c;那么函数内部将使用一个空对象 {} 作为参数。 示例 const …

基于STM32与OpenMV的智能垃圾分类系统:SSD目标检测算法的设计与流程

一、项目概述 随着城市化进程的加快&#xff0c;垃圾分类变得越来越重要。本文设计了一套基于STM32F103单片机、图像处理技术和传感器技术的智能垃圾分类系统。该系统能够自动识别垃圾类型&#xff0c;并通过机械装置进行准确分类&#xff0c;有效提升垃圾分类的效率和准确性。…

运放模块的选型参数

增益带宽积-----尤其重要&#xff1a; GWB 增益*带宽 压摆率&#xff1a; 高带宽的运放一般都是电流型运放&#xff1a; 注意压摆率计算公式里面的Vopp参数是放大后的电压最大值&#xff1a; 参数&#xff0c;布局一定参考数据手册&#xff01;&#xff01;&#xff01;&…

关于AI副业,能说的都说了(最核心3大赛道、机会、方向)

AI&#xff0c;是生产力工具~ AI&#xff0c;也是焦虑和痛点 一直有小伙伴在问AI副业的事儿&#xff0c;之前也分享过很多。 但是&#xff0c;很多人对AI于副业的作用&#xff0c;过于表面和形式&#xff0c;所以&#xff0c;狂金来叨叨一下最核心的3大赛道&#xff0c;希望…

本地部署ollama大模型

方案一 1. 安装 Docker Ollama 大模型通常是通过 Docker 来运行的&#xff0c;因此首先需要确保本地已经安装了 Docker。如果还没有安装 Docker&#xff0c;可以参考以下安装步骤&#xff1a; Mac 用户&#xff1a; 前往 Docker 官网 下载并安装 Docker Desktop。安装完成后&…

【C语言】动态内存管理:malloc、calloc、realloc、free

本篇介绍一下C语言中的malloc/calloc/realloc。 使用这些函数需要包含头文件<stdlib.h>。malloc/calloc/realloc申请的空间都是 堆区的。 1.malloc和free 1.1 malloc C语言提供了一个动态内存开辟的函数malloc&#xff0c;函数原型如下。 void* malloc(size_t size);…

mysql学习教程,从入门到精通,SQL RIGHT JOIN语句(24)

1、SQL RIGHT JOIN语句 RIGHT JOIN&#xff08;也被称为RIGHT OUTER JOIN&#xff09;是一种SQL语句&#xff0c;它用于从两个或多个表中根据连接条件返回右表&#xff08;RIGHT JOIN语句中指定的表&#xff09;的所有记录&#xff0c;以及左表中匹配的记录。如果左表中的行在…

确保架构与业务一致性和合规性的成功转型之路:理论与实践的全面解读

架构与业务一致性在数字化转型中的重要性 在数字化转型的过程中&#xff0c;企业架构与业务的一致性是确保技术变革能够真正推动业务发展的关键因素之一。企业架构不仅要支持业务需求&#xff0c;还需要确保与行业标准、法律法规的合规性。通过将理论转化为实践&#xff0c;企…

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码&#xff0c;限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改&#xff0c;抓取上传数据包&#xff0c;并且修改 Content-Type 3.服务端检测&#xff08;目录路径检测&#xff09; 对目…

无人机专业实操重要性凸显,组装、调试、改装技术详解

无人机专业的实操性在当今技术飞速发展的背景下显得尤为重要&#xff0c;这不仅体现在无人机的日常应用上&#xff0c;还贯穿于无人机的组装、调试及改装等关键环节中。以下是对这些技术环节的详细解析&#xff1a; 一、无人机组装技术 无人机的组装是无人机技术的基础&#x…

mysql8.0安装后没有my.ini

今天安装mysql后想改一下配置文件看了一下安装路径 C:\Program Files\MySQL\MySQL Server 8.0 发现根本没有这个文件查看隐藏文件也没用查了之后才知道换地方了和原来的5.7不一样 新地址是C:\ProgramData\MySQL\MySQL Server 8.0 文件也是隐藏的记得改一下配置