有点不好写,大家可以看看这个思路,当然有多种方法!

package zhan;import java.util.ArrayList;
import java.util.List;
import java.util.Stack;//中缀表达式转后缀表达式
//1+((2+3)*4)-5转换成后缀表达式
//1.因为对String操作不方便,因此先把中缀放到集合里面
//2.将得到的中缀表达式对应的list转换成后缀表达式对应的list
public class ArrayStackTest04 {public static void main(String[] args) {String s="1+((2+3)*4)-5";System.out.println(zhongZhuiList(s));//因为对String操作不方便,因此先把中缀放到集合里面System.out.println(houZhuiList(zhongZhuiList(s)));//将得到的中缀表达式对应的list转换成后缀表达式对应的listSystem.out.println(cal(houZhuiList(zhongZhuiList(s))));//计算}//先将中缀表达式转  换成list集合public static List<String> zhongZhuiList(String s){List<String> list=new ArrayList<>();String str;//用于拼接多位数char c;//每遍历到一个字符,就放入到cint i=0;//指针,用于遍历中缀表达式do {//先判定是不是运算符if ((c=s.charAt(i))<48||(c=s.charAt(i))>57){list.add(c+"");i++;}else{//是数字,需要考虑多位数str="";while (i<s.length()&&(c=s.charAt(i))>=48&&(c=s.charAt(i))<=57){str+=c;i++;}list.add(str);}}while (i<s.length());return list;}//2.将得到的中缀表达式对应的list转换成后缀表达式对应的listpublic static List<String> houZhuiList(List<String> list){//定义两个栈Stack<String> s1=new Stack<>();//s2这个栈,在整个转换过程中,没有出栈操作,而且后面我们还需要逆序输出,因此用栈比较麻烦,可以直接用集合//Stack<String> s2=new Stack<>();List<String> s2=new ArrayList<>();//遍历中缀表达式集合for (String item:list){//如果是一个数字,加入到s2if (item.matches("\\d+")){s2.add(item);}else if (item.equals("(")){s1.push(item);}else if (item.equals(")")){//如果是右括号,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这对括号丢弃while (!s1.peek().equals("(")){s2.add(s1.pop());}s1.pop();//将(弹出s1  消除小括号}else {//当item的优先级小于等于s1栈顶运算符的优先级时,将s1栈顶的运算符弹出并压入到s2,再转到4.1与s1中新的栈顶运算比较while (s1.size()!=0&&Operation.get(s1.peek())>=Operation.get(item)){s2.add(s1.pop());}//还需要将item压入栈s1.push(item);}}//将s1中剩余的运算符依次弹出并加入s2while (s1.size()!=0){s2.add(s1.pop());}return s2;}//完成对逆波兰表达式的运算public static int cal(List<String> list){//创建只需一个栈Stack<String> stack=new Stack<>();//遍历listfor (String p:list) {//使用正则表达式来取数if (p.matches("\\d+")) {//匹配的是多位数stack.push(p);//如果是数字,则入栈,如果是符号则进行运算}else {int num2=Integer.parseInt(stack.pop());int num1=Integer.parseInt(stack.pop());int res=0;if (p.equals("+")){res=num1+num2;}else if (p.equals("-")){res=num1-num2;}else if (p.equals("*")){res=num1*num2;}else if (p.equals("/")){res=num1/num2;}else {throw new RuntimeException("运算符有错误");}//把计算结果入栈stack.push(String.valueOf(res));//或者stack.push(res+"");}}return Integer.parseInt(stack.pop());}}
//编写一个类返回一个运算符对应的优先级
class Operation{private static int ADD=1;private static int SUB=1;private static int MUL=2;private static int DIV=2;//写一个方法 返回对应的优先级public static int get(String operation){int result=0;switch (operation){case "+":result= ADD;break;case "-":result= SUB;break;case "*":result= MUL;break;case "/":result=DIV;break;default:result=0;break;}return result;}
}

Java中缀表达式转后缀表达式.相关推荐

  1. java中缀表达式转后缀表达式(逆波兰算法)

    四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等 ...

  2. java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...

    本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...

  3. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...

    程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...

  4. Java数据结构之中缀表达式转后缀表达式

    简介 通过数组模拟栈进行中缀表达式转后缀表达式,再进行计算 不说废话,请看代码. package com.atguigu.Stack;import java.util.ArrayList; impor ...

  5. java利用栈求复杂表达式_java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式...

    利用栈Stack计算合法的算术表达式 限定的算术表达式求值问题:包含 "+"."-"."*"."/" .正整数和圆括号的 ...

  6. 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...

    一.逆波兰式(后缀表达式)计算 思路: * 1.遍历逆波兰式的集合 * 2.当遍历的元素为数字时,入栈 stack * 3.当遍历的元素为运算符时,stack栈弹出两个数,num2 num1,并用该运 ...

  7. 九、中缀表达式转为后缀表达式

    使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...

  8. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

  9. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

最新文章

  1. having 与where 的异同点
  2. js 输出中文乱码 解决办法
  3. 线性表的顺序存储——顺序存储结构的抽象实现
  4. 华为动态NAT小实验演示
  5. day13 java的多态
  6. 禁用了ssh的密码认证方式导致无法登陆
  7. FD.io VPP用户文档:会话层架构与VPP应用
  8. 使用IBM SPSS Statistics的新手应该如何入门
  9. 蚂蚁课堂视频笔记思维导图-4期 七、Docker
  10. 详解YUV420数据格式
  11. MCTS (Monte Carlo Tree Search)
  12. C语言编译器之一,GCC编译器
  13. 李开复:如何设计你的年度计划
  14. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
  15. 离开谷歌回归斯坦福,“AI女神”李飞飞新动向揭晓
  16. u盘里的文件不见了怎么恢复正常?
  17. tesla p4 linux驱动,Ubuntu 16.04. 装tesla p4 显卡驱动+cuda9.0+docker+nvidia-docker 详细方法,这里是服务器为主...
  18. 小学四年级计算机上册考试试题,小学四年级数学上册复习试题
  19. 看英文数据手册必备之——Copy Translator
  20. svn和git不过是工具而已

热门文章

  1. 辅助工具_米家全景相机如何拍全景图
  2. 服务器进程显示异常,查看服务器异常进程
  3. 2022学校体育教育及设施展览会
  4. 基于SSM框架的校园跑腿设计与实现
  5. 如何方便快捷地判断浏览器是否开启了IE兼容模式
  6. 决策树算法之鸢尾花特征分类可视化详解【机器学习】
  7. 分享一个可以随便听歌的网站
  8. ContentCachingRequestWrapper解决入参读取
  9. 计算机键盘上的f5的作用是,电脑键盘F1~F12原来是这样用的,只知道F5怎么用的话未免弱爆了...
  10. c语言类似wn的字符怎么输,【C语言】【wndow】--在线翻译器.doc