四则运算是栈的重要应用之一

中缀表达式转后缀表达式(逆波兰算法)过程

  1. 从左到右遍历中缀表达式
  2. 数字直接输出为后缀表达式一部分
  3. 如果是符号,则判断与栈顶元素的优先级
  4. 高于栈顶元素优先级直接入栈
  5. 低于或等于栈顶优先级栈顶元素出栈并输出为后缀表达式一部分(注意这里是递归比较栈顶元素的优先级并出栈),最后将当前元素入栈
    直到遍历完中缀表达式,最终输出后缀表达式

下面是自己的实现源码

package com.yhq.demospringboot;
import org.apache.commons.lang3.StringUtils;
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
/*** yanghq* 2018/3/12*/
public class PreToAfterUtil {private static String leftChar = "(";
private static String rightChar = ")";
private static Map<String, Integer> operationSymbolMap = new HashMap<>();static {//初始化符号和优先级operationSymbolMap.put(")",00); //右括号需匹配左括号,故优先级最低operationSymbolMap.put("+",10);operationSymbolMap.put("-",10);operationSymbolMap.put("*",20);operationSymbolMap.put("/",20);operationSymbolMap.put("(",30);
}/*** 中缀表达式转化为后缀表达式* @param strings* @return*/
public Queue parsePre(String[] strings) {Stack<String> preStack = new Stack<String>();Queue<String> queue = new LinkedBlockingQueue();int i = 0;while(i<strings.length && Objects.nonNull(strings[i])) {if(StringUtils.isNumeric(strings[i])) {queue.add(strings[i]);}else if(StringUtils.isNotEmpty(strings[i])) {if(preStack.isEmpty()) {preStack.push(strings[i]);} else {String top = preStack.pop();if(comparePriority(strings[i], top) < 0) {if(top.equals(leftChar)) {preStack.push(top);preStack.push(strings[i]);}else if(strings[i].equals(rightChar)) {appendTo(queue, top);preStack.pop();} else{appendTo(queue, top);popPre(preStack, strings[i], queue);preStack.push(strings[i]); //当前元素入栈}} else {preStack.push(top);preStack.push(strings[i]);}}}i++;}while (!preStack.isEmpty()) {queue.add(preStack.pop());}return queue;
}/*** 递归比较当前元素与栈顶元素优先级* @param preStatck* @param charTemp* @param queue*/
public void popPre(Stack<String> preStatck, String charTemp, Queue queue) {if(!preStatck.isEmpty()) {String top = preStatck.pop();if(comparePriority(charTemp, top) <= 0) {//低于栈顶元素,成为后缀表达式一部分appendTo(queue, top);popPre(preStatck, charTemp, queue);} else {preStatck.push(top);}}
}private void appendTo(Queue queue, String s) {if(!s.equals(leftChar) && !s.equals(rightChar)) {queue.add(s);}
}/*** 比较优先级* @param start* @param to* @return*/
private int comparePriority(String start, String to) {return operationSymbolMap.get(start).compareTo(operationSymbolMap.get(to));
}/*** 计算后缀表达式结果* @param queue* @return*/
public int computeResult(Queue<String> queue) {int result = 0;if(Objects.isNull(queue)) {return result;}String s = queue.poll();Stack<Integer> stack = new Stack();while(Objects.nonNull(s)) {if(StringUtils.isNumeric(s)) {stack.push(Integer.valueOf(s));}else if(!StringUtils.isEmpty(s)) {int first = 0;int second = 0;switch (s) {case "+" :first = stack.pop();second = stack.pop();result = first + second;stack.push(result);break;case "-" :first = stack.pop();second = stack.pop();result = second - first;stack.push(result);break;case "*" :first = stack.pop();second = stack.pop();result = first * second;stack.push(result);break;case "/" :first = stack.pop();second = stack.pop();result = second/first;stack.push(result);break;}}s = queue.poll();}return result;
}/*** 测试* @param args*/
public static void main(String[] args) {String[] pre = new String[]{"8","+","(","6","-","1",")","*","2","+","10","/","2"};StringBuilder sb = new StringBuilder();for (int i = 0; i < pre.length; i++) {sb.append(pre[i]);}System.out.println("前缀表达式:" + sb.toString());Queue queue = new PreToAfterUtil().parsePre(pre);System.out.println("后缀表达式:" + queue.toString());System.out.println("后缀表达式计算结果:" + new PreToAfterUtil().computeResult(queue));
}}

输出结果展示
前缀表达式:8+(6-1)*2+10/2
后缀表达式:[8, 6, 1, -, 2, *, +, 10, 2, /, +]
后缀表达式计算结果:23

转载于:https://blog.51cto.com/11290909/2085571

java中缀表达式转后缀表达式(逆波兰算法)相关推荐

  1. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  2. Python下基于栈和逆波兰算法实现四则运算

    参考<大话数据结构>一书4.9节,Python下基于栈和逆波兰算法实现四则运算. 栈的实现使用顺序结构,即基于列表实现,参考本人博客Python实现顺序结构栈Sequence Stack ...

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

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

  4. 逆波兰表达式中缀表达式转换为后缀表达式

    中缀表达式转换为后缀表达式 思路分析 代码实现 package com.atguigu.stack;import javax.swing.plaf.nimbus.State; import java. ...

  5. 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)

    前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...

  6. 使用栈实现中缀表达式转换成后缀表达式并计算结果(逆波兰计算器)

    一.中缀表达式转换成后缀表达式 具体步骤如下: 1.初始化栈stack(暂时存放运算符)以及集合list(存放后缀表达式) 2.从左向右扫描中缀表达式 3.当前元素为数字时,直接添加到list中 4. ...

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

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

  8. Java中缀表达式转后缀表达式.

    有点不好写,大家可以看看这个思路,当然有多种方法! package zhan;import java.util.ArrayList; import java.util.List; import jav ...

  9. 数据结构-栈应用之逆波兰表达式(后缀表达式)

    逆波兰表达式含义我就不做赘述了,摘自百科上的一段话: 逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为中缀表示.波兰逻辑学家J.Lukas ...

最新文章

  1. 【转发】PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
  2. node使用npm一句命令停止某个端口号 xl_close_port
  3. ASVL_PAF_RGB24_B8G8R8 格式转换
  4. DbSetT().Where(e = true)之后再想Include怎么办?
  5. PHP RSS/Feed 生成类库(支持RSS 1.0/2.0和ATOM)
  6. 姚安娜首个代言摩卡汽车人舞蹈短片出炉
  7. 怎么在网站中正确使用JQuery代码
  8. LabView常用快捷键
  9. AllyCAD v3.5 R12 1CD(专业CAD软件)
  10. file js new 传到后台_JS读取文件且AJAX传输到后台
  11. Tomcat 修改端口
  12. 谷歌清楚缓存快捷键_清除浏览器缓存的快捷键是什么
  13. 用python在大麦网抢票视频_大麦网怎么抢票快 大麦网抢票最快的方法
  14. 云更新服务器更新不了最新游戏,云更新服务器环境要求 | 专业网吧维护
  15. 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
  16. 函数在c99中隐式声明无效_C函数的隐式声明
  17. SQL Server 2019下载安装教程
  18. 黑灰对比可以为高大上网站风格代言
  19. 启锐 588 打印机每次打印都流出一部分,没有重新切换纸张
  20. 使用LM2575代替7805

热门文章

  1. 【Qt】通过QtCreator源码学习Qt(十):多国语言支持
  2. 互联网流量太贵!新零售成创业新风口
  3. docker注册表回传失败 群晖6.2_Glances实时监视群晖运行状况
  4. sftp shell 批量上传文件_Shell自动上传下载文件到SFTP服务器
  5. angular蚂蚁_Angular 中后台前端解决方案 - Ng Alain 介绍
  6. basler相机参数简要中文说明_附下载| OpenCV最新中文版官方教程
  7. android如何展示富文本_android高仿今日头条富文本编辑(发布文章)
  8. python打开网页存图_python 获取网页图片 保存在本地
  9. Java项目:茶叶售卖商城系统(java+SSM+JSP+EasyUi+mysql)
  10. java servlet 多线程_Servlet的多线程和线程安全