例子

例题1
中缀表达式“8+4-6*2”
后缀表达式表示为:8 4 + 6 2 * -

例题2
中缀表达式:(70 + 30) *20 + 10 / 2 - 3
后缀表达式: 70 30 + 20 * 10 2 / + 3 -

例题3
中缀表达式: 10 * 3 +(3-1)* 2 - 10 / 2
后缀表达式:10 3 * 3 1 - 2 * + 10 2 / -

例题3:
中缀表达式“2*(3+5)+7/1-4
后缀表达式表示为:3 5 + 2 * 7 1 /4 - +

例题4:
中缀表达式为:1.0+(2-3)4+4/2
后缀表达式为:1.0 2 3 - 4
+ 4 2 / +

题目解析

容易错
小心空格
小心数字不一定只有一位
注意数字的反转问题

  • 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
  • 从左至右扫描中缀表达式;
    • 遇到操作数时,将其压入S2;
    • 遇到运算符时,比较其与S1栈顶运算符的优先级:
      • 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
      • 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
      • 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
    • 遇到括号时:
      • 如果是左括号“(”,则直接压入S1;
      • 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
  • 循环扫描,直到表达式的最右边;
  • 将S1中剩余的运算符依次弹出并压入S2;
  • 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)。

CC

第一版

public class EcmDef {public static boolean isNumeric(String str) {String bigStr;try {bigStr = new BigDecimal(str).toString();} catch (Exception e) {return false;//异常 说明包含非数字。}return true;}// 数字越大优先级越高// 只有(,), +, -, * ,/ 六种符号。 置于 (和)不考虑public static int Priority(String oper){if (oper.equals("+") || oper.equals("-")){return 1;}else if (oper.equals("*") || oper.equals("/")){return 2;}else{throw  new RuntimeException("错误的符号:" + oper);}}//正整数public static String mu_back(String str) {Stack<String> numStack = new Stack<>();Stack<String> operStack = new Stack<>();int i = 0;while (true){if (i >= str.length()){break;}char c = str.charAt(i);if (c == ' '){i++; // 跳过continue;  //进入下一轮循环}String s = String.valueOf(c);if (isNumeric(s)){StringBuilder t = new StringBuilder();t.append(s);while (++i < str.length()){s = String.valueOf(str.charAt(i));if (isNumeric(s)){t.append(s);}else{  // 不是数字就跳出循环break;}}// 指针反转numStack.push(t.reverse().toString());continue;}if (operStack.empty() || c ==   '('){operStack.push(s);  // 入栈i++;  // 指针前移}else if (c == ')'){if (operStack.size() < 2){throw new RuntimeException("表达式错误");}numStack.push(operStack.pop());operStack.pop(); // 下一个一定是)。  )不用压栈i++; // 指针前移}else{if (operStack.size() < 1){throw new RuntimeException("表达式错误");}if (operStack.peek().equals("(")){ // 栈顶是(operStack.push(s); //压栈i++; // 指针前移continue;}if (Priority(s) > Priority(operStack.peek())){operStack.push(s);i++;}else{numStack.push(operStack.pop());  // 优先级小于等于}}}// 将符号栈导入数字栈while (!operStack.empty()){numStack.push(operStack.pop());}StringBuilder ans = new StringBuilder();while (!numStack.empty()){ans.append(numStack.pop());ans.append(" ");}return ans.reverse().toString();}public static void main(String[] args) {System.out.println(mu_back("10 * 3 +(3-1)* 2 - 10 / 2")); // 20 30 * 4 + 5 *}
}

第二版

https://www.runoob.com/java/data-intopost.html

使用栈实现中缀表达式转后缀表达式相关推荐

  1. 数据结构——栈——中缀表达式和后缀表达式

    什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...

  2. 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

    [0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...

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

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

  4. 使用栈实现中缀表达式转为后缀表达式和后缀表达式的求解

    书籍在线网址http://interactivepython.org/runestone/static/pythonds/index.html 中文翻译书籍:https://facert.gitboo ...

  5. 栈应用:中缀表达式转后缀表达式

    网上有很多关于中缀转后缀的文章,很多文章或多或少都有bug,包括一些教学视频,经过本人无数次测试,保证下面的代码运算结果的正确性!前提是你写的中缀表达式是正确的哈,没有做中缀表达式是否正确的的完整性校 ...

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

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

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

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

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

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

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

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

  10. 数据结构实验——中缀表达式转为后缀表达式

    一.实验内容: 编写程序,实现中缀表达式化为后缀式输出. 已知中缀表达式中操作数全部用小写英文字母表示,运算符只含有+, -, *, /四种,定界符只有( )以及结束符#. 二.程序源代码: 运行示例 ...

最新文章

  1. 操作系统常用词典(二)
  2. linux 里常用的几个查找命令
  3. ERROR: This virtual machine appears to be in use
  4. java 线程池技术_Java线程池技术以及实现
  5. 隐藏导航条HTML,jQuery实现的导航条切换可显示隐藏
  6. python从txt读取数据并画图_Python读取txt某几列绘图的方法
  7. 简述面向对象中__new__和__init__区别,这道题朝简单!
  8. 华为辟谣将发布石墨烯电池手机;梁建章回应携程杀熟;GitLab 12.6 发布 | 极客头条...
  9. 判斷指定資料庫存取權
  10. Qt 插件学习(一)
  11. 杨校老师项目之基于SSM企业物流快递配送管理系统
  12. 一级计算机office选择题题库及答案,计算机一级msoffice选择题题库40套含答案
  13. win10每次开机桌面计算机就没有,怎样解决Win10开机需要按F1才能进入桌面
  14. Mac下浏览器超实用快捷键
  15. 互联网晚报 | 1月8日 星期六 | 小米商城已支持数字人民币支付;微信视频号将上线付费直播间;苹果CEO去年薪酬近1亿美元...
  16. 迪士尼源码_如何在迪士尼+上禁用自动播放和背景视频
  17. DOC与DOCX的区别
  18. Matlab快速创建矩阵的方法(创建特殊矩阵)
  19. 菲律宾德拉斯大学计算机专业,热门专业选择
  20. 从浏览器地址栏输入url到请求返回发生了什么(深问)

热门文章

  1. 哔哩哔哩 2019校园招聘 开发工程师-2018.09.21
  2. 微信小程序项目实例Java后台的小程序求职招聘|兼职管理系统
  3. php 字符串替换中文,PHP中文字符串替换其中为*的方法
  4. 最新iOS高薪面试必备要点总结
  5. Windows如何远程连接服务器?Linux服务器如何远程登录?远程连接服务器命令
  6. 静态网页制作HTML学习笔记
  7. Ubuntu20.04 系统安装USB无线网卡 TL-WDN5200免驱版 安转失败不显示WiFi的一种解决方案
  8. 微信小程序的生命周期函数
  9. 争议不断的AI绘画,靠什么成为了顶流?
  10. 汇丰银行出售美国加州零售业务分行;拜耳与阿里健康将在多个领域开展深度合作 | 美通企业日报...