将中缀表达式转换为后缀表达式:

(1)当读到数字直接送至输出队列中;

(2)当读到运算符t时:

a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;

这句话不好理解,可以说成这样,从栈顶开始,依次弹出比当前处理的运算符优先级高的运算符,直到一个比它优先级低的或者遇到了一个左括号就停止。

b.t进栈

(3)读到左括号时总是将它压入栈中;

(4)读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号;

(5)中缀表达式全部读完后,若栈中仍有运算符,将其送到输出队列中。

// 将中缀表达式转换为后缀表达式public static String infixToSuffix(String exp) {// 创建操作符堆栈Stack<Character> s = new Stack<Character>();String suffix = ""; // 输出的后缀表达式字符串。int len = exp.length();for (int i = 0; i < len; i++) {char temp; // 临时字符变量char ch = exp.charAt(i);switch (ch) {// 忽略空格case ' ':break;// 如果是左括号,直接压入堆栈。case '(':s.push(ch);break;// 如果是加号或者减号,则弹出所有的字符送至输出序列,直到碰到左括号为止// 然后把该运算符再压进堆栈。case '+':case '-':while (!s.isEmpty()) {temp = s.pop();if (temp == '(') {s.push(temp);break;}suffix += temp;}s.push(ch); // 把运算符压进堆栈。break;// 如果是乘号或者除号,则弹出所有的字符送至输出序列,直到碰到左括号或者加号或者减号为止// 然后把该运算符再压进堆栈。case '*':case '/':while (!s.isEmpty()) {temp = s.pop();if (temp == '(' || temp == '+' || temp == '-') {s.push(temp);break;} else {suffix += temp;}}s.push(ch);break;case ')':while (!s.isEmpty()) {temp = s.pop();if (temp == '(') {break;} else {suffix += temp;}}break;// 默认如果读到是数字,则直接送至输出序列default:suffix += ch;break;}}// 如果栈不为空,把剩余的运算符依次弹出,送至输出序列。while (!s.isEmpty()) {suffix += s.pop();}return suffix;}
// 输入后缀表达式字符串得到运算结果public static double suffixToArithmetic(String exp) {Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); // 使用正则表达式匹配数字// 用指定字符,把字符串转换为字符串数组。String strings[] = exp.split("");Stack<Double> stack = new Stack<Double>();for (int i = 0; i < strings.length; i++) {if (strings[i].equals(""))continue;// 如果是数字,则进栈if ((pattern.matcher(strings[i])).matches()) {stack.push(Double.parseDouble(strings[i]));} else {// 如果是运算符,弹出运算数,计算结果。double y = stack.pop();double x = stack.pop();stack.push(caculate(x, y, strings[i])); // 将运算结果重新压入栈。}}return stack.pop();}
//计算
private static double caculate(double x, double y, String simble) {if (simble.trim().equals("+"))return x + y;if (simble.trim().equals("-"))return x - y;if (simble.trim().equals("*"))return x * y;if (simble.trim().equals("/"))return x / y;return 0;}
}

转载于:https://blog.51cto.com/wukong0716/1687398

学习日志-中缀表达式转后缀表达式并计算结果相关推荐

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

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

  2. 中缀表达式转后缀表达式并求值

    因为在学校实在是太闲了,所以写了一个表达式求值的C语言程序,希望大佬可以多多指正. 基本思路: 就像把大象装进冰箱一样,我们需要三步进行表达式的求值工作. 输入一个中缀表达式(就是平常我们见的表达式) ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式

    [练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...

最新文章

  1. install python+twisted+mysqldb+django on mac
  2. pandas基本数据操作
  3. ubuntu修改mysql root密码_Ubuntu 下修改mysqlroot密码
  4. leetCode刷题--两数相加
  5. 分子克隆基础:什么是质粒
  6. 浏览器渲染阻塞与优化-详解推迟加载、异步加载。
  7. Spring Boot中使用模板引擎引用资源
  8. CSDN怎么换行?添加空行
  9. 利用Power Designer反向数据库结构
  10. 如何让imageView铺满屏幕?
  11. linux wifi信道,2.4G wifi 的频道/信道 20M 40M的概念,区别
  12. Kinect+unity 实现体感格斗闯关小游戏
  13. ip地址与long数值互相转换
  14. DeepStream5.0系列之yolov5使用
  15. 一文了解云计算,全世界一台计算机
  16. python处理windows弹窗_python windows弹窗
  17. 让你的显示器秒变无广告智能电视,泰捷WEBOX 60C电视盒子评测
  18. 什么是HEIC格式?HEIC图像转换jpg|png方法?
  19. 解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解
  20. 通过反射解决在HuaWei手机出现Register too many Broadcast Receivers的crash

热门文章

  1. 详解struts2中struts.properties
  2. java 同步中的线程出现异常会放弃锁吗
  3. 从一个实例看jaxb的强大
  4. html中的点击事件
  5. html5该怎么样学习?零基础入门HTML5学习路线
  6. Git 使用帮助(下)
  7. 前端逼死强迫症系列之javascript续集
  8. 构建基于分布式SOA架构的统一身份认证体系
  9. 在SQL Server 2008中调用.net,dll
  10. display与visibility区别