目录

什么是后缀表达式

后缀表达式示例图

栈实现后缀表达式

代码实现中缀表达式——后缀表达式

后缀表达式计算器的定义


​​​​​​​

什么是后缀表达式

也叫逆波兰表达式,将运算符写在操作数之后

中缀形式:(10+20/2*3)/2+8

后缀形式:10 20 2 / 3 * + 2 / 8 +

方便计算机计算,但对用户不友好

后缀表达式示例图

栈实现后缀表达式

代码实现中缀表达式——后缀表达式

package p2.线性结构;public class InfixToSuffix {public static void main(String[] args) {String expression = "(10+20/2*3)/2+8";expression = infixToSuffix(expression);System.out.println(expression);}public  static String infixToSuffix(String expression) {ArrayStack<String> opStack = new ArrayStack<>();ArrayList<String> suffixList = new ArrayList<>();expression = insertBlanks(expression);String[] tokens = expression.split(" ");for(String token : tokens) {if (token.length() == 0) {continue;}if (isOperator(token)) {while (true) {if (opStack.isEmpty() || opStack.peek().equals("(") ||priority(opStack.peek()) < priority(token)) {opStack.push(token);break;}suffixList.add(opStack.pop());}}else if(token.equals("(")){opStack.push(token);}else if(token.equals(")")){while (!opStack.peek().equals("(")){suffixList.add(opStack.pop());}opStack.pop();}else if(isNumber(token)){suffixList.add(token);}else {throw new IllegalArgumentException("wrong cha! " + expression);}}while(!opStack.isEmpty()){suffixList.add(opStack.pop());}StringBuilder sb  = new StringBuilder();for(int i = 0; i < suffixList.size(); i++){sb.append(suffixList.get(i));sb.append(' ');}return sb.toString();}private static int priority(String token) {if(token.equals("+")||token.equals("-")){return 0;}if(token.equals("*")||token.equals("/")){return 1;}return -1;}private static boolean isNumber(String token) {return token.matches("\\d+");}private static boolean isOperator(String token) {return token.equals("+")|| token.equals("-")||token.equals("*")||token.equals("/");}private static String insertBlanks(String expression) {StringBuilder sb = new StringBuilder();for (int i = 0; i < expression.length(); i++) {char c = expression.charAt(i);if (c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/') {sb.append(' ');sb.append(c);sb.append(' ');} else {sb.append(c);}}return sb.toString();}
}

后缀表达式计算器的定义

package p2.线性结构;public class SuffixCalculator {public static void main(String[] args) {String infixExpression = "(10+20/2*3)/2+8";String suffixExpression = InfixToSuffix.infixToSuffix(infixExpression);int result = evaluateSuffix(suffixExpression);System.out.println(result);}private static int evaluateSuffix(String expression) {ArrayStack<Integer> stack = new ArrayStack<>();String [] tokens =  expression.split(" ");for(String token : tokens){if(token.length() == 0){continue;}if(isNumber(token)){stack.push(new Integer(token));}else{processAnOperator(stack,token);}}return stack.pop();}private static void processAnOperator(ArrayStack<Integer> stack, String token) {int num1 = stack.pop();int num2 = stack.pop();if(token.equals("+")){stack.push(num2+num1);}else if(token.equals("-")){stack.push(num2-num1);}else if(token.equals("*")){stack.push(num2*num1);}else if(token.equals("/")){stack.push(num2/num1);}}private static boolean isNumber(String token) {return token.matches("\\d+");}
}

数据结构与算法——中缀表达式转后缀表达式相关推荐

  1. 【数据结构与算法】【12】前缀表达式、中缀表达式、后缀表达式

    什么是前缀表达式.中缀表达式.后缀表达式 前缀表达式.中缀表达式.后缀表达式,是通过树来存储和计算表达式的三种不同方式 以如下公式为例 (a+(b−c))∗d( a+(b-c) )*d(a+(b−c) ...

  2. 数据结构与算法——中缀转后缀表达式以及计算

    中缀表达式转后缀表达式 思路分析: 初始化两个栈:运算符栈s1 和储存中间结果的栈s2 从左至右扫描中缀表达式 遇到操作数,将其压入s2 遇到运算符时,比较其与s1 栈顶运算符的优先级 如果s1 为空 ...

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

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

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

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

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

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

  6. 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

    #!/usr/bin/env python # -*- coding: utf-8 -*-# learn <<Problem Solving with Algorithms and Dat ...

  7. 《数据结构》:中缀表达式转后缀表达式 后缀表达式的计算

    目录 一.基本概念 二.中缀表达式转后缀表达式 例       中缀表达式  2*(3+5)+7/1-4  转换为后缀表达式 三.后缀表达式的计算 例       后缀表达式  2 3 5 + * 7 ...

  8. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  9. 中缀表达式转后缀表达式算法思想

    算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出, ...

  10. 数据结构 - 拓展突破(C++实现中缀表达式转前缀表达式,中缀表达式转后缀表达式,前缀表达式求值,中缀表达式求值)

    文章目录 1. C++中缀表达式转后缀表达式 2. C++中缀表达式转前缀表达式 3. C++后缀表达式求值 4. C++前缀表达式求值 1. C++中缀表达式转后缀表达式 输入中缀表达式样例: 2+ ...

最新文章

  1. 更换AppleWWDRCA.cer证书
  2. 计算机三级网络技术题库第15套,计算机等级考试理论试题第二十五套
  3. 第一个Struts2程序
  4. 成功解决SyntaxError: encoding problem: utf8 with BOM
  5. 查询去重_如何在 1 秒内做到大数据精准去重?
  6. 10个常见的JS语言错误总汇
  7. 云计算监控—Prometheus监控系统(文末赠书)
  8. android sdk与adt版本,eclipse中sdk与adt版本不兼容该怎么解决? 三种方法帮你搞定
  9. 倒计时小工具_想要工作效率更高?这几款计时工具你一定不能错过!
  10. TCP/IP网络编程(1)
  11. HPC在石油勘探行业正面临三大考验
  12. 懒人神器——新手必备的图片后期处理软件
  13. 【C语言】07-基本语句和运算
  14. Android开发-Android项目结构
  15. 平面内 两直线/两向量的夹角方向 逆时针 还是顺时针
  16. 知其然就够了——大数据时代的思考之一
  17. chd mysql 作用_Cloudera Manager CHD 切换内置数据库PostgreSQL 到 Mysql
  18. Excel 计算两个日期间相差的天数、月数或年数 DATEDIF函数
  19. 传奇服务器如何修改地图和刷怪,传奇如何将怪物刷在指定地图?
  20. 微软lync 持续服务器,Lync Server 2013 持久聊天服务器通道关闭

热门文章

  1. html倒计时代码+微信可用,微信页面倒计时代码(解决safari不兼容date的问题)
  2. Python网络爬虫简单教程——第一部
  3. 冯 . 诺依曼体系结构对计算机发展的限制
  4. 明日又天涯——蝶舞萧霞
  5. ev3编程 越野机器人_Lego ev3机器人怎么编程
  6. php无闪动刷新,简单的无闪动刷新页面/部分内容
  7. docker占用磁盘空间太大的解决办法
  8. 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码
  9. Oracle的基本练习:登陆、查看连接、管理登陆用户、修改进程数
  10. java spi 扩展_【扩展和解耦】JAVA原生SPI实现插件扩展