当前位置: 首页 > news >正文

数据结构与算法——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"));}
}

相关文章:

  • Python | 第八章 | 数据容器
  • 爬虫入门 Selenium使用
  • 906. 超级回文数
  • 算法复杂度-空间
  • JAVA红娘婚恋相亲交友系统源码全面解析
  • Java语法-类和对象之抽象类和接口
  • 【软件测试】详解软件测试中的测试级别
  • Stable Diffusion 优秀博客转载
  • Spark 中 任务集 TaskSet 详解
  • 青动CRM V3.2.1
  • 第十四届蓝桥杯真题Python c组F.棋盘(持续更新)
  • Linux 配置与管理 SWAP(虚拟内存)
  • 9月28日
  • 【Fastapi】参数获取,json和query
  • STM32 RTC实时时钟学习总结
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JavaScript HTML DOM
  • Java深入 - 深入理解Java集合
  • Mac转Windows的拯救指南
  • Material Design
  • MySQL数据库运维之数据恢复
  • Quartz初级教程
  • spring + angular 实现导出excel
  • vuex 笔记整理
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 二维平面内的碰撞检测【一】
  • 好的网址,关于.net 4.0 ,vs 2010
  • 盘点那些不知名却常用的 Git 操作
  • 前端_面试
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 异常机制详解
  • puppet连载22:define用法
  • 我们雇佣了一只大猴子...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • (06)金属布线——为半导体注入生命的连接
  • (1)无线电失控保护(二)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (笔记)M1使用hombrew安装qemu
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (蓝桥杯每日一题)love
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Maven插件解析运行机制
  • (学习总结16)C++模版2
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)iOS字体
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程