学习日志-中缀表达式转后缀表达式并计算结果
将中缀表达式转换为后缀表达式:
(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
学习日志-中缀表达式转后缀表达式并计算结果相关推荐
- 栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)
[0]README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现: 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理 ...
- 中缀表达式转后缀表达式并求值
因为在学校实在是太闲了,所以写了一个表达式求值的C语言程序,希望大佬可以多多指正. 基本思路: 就像把大象装进冰箱一样,我们需要三步进行表达式的求值工作. 输入一个中缀表达式(就是平常我们见的表达式) ...
- java中缀表达式转后缀表达式(逆波兰算法)
四则运算是栈的重要应用之一 中缀表达式转后缀表达式(逆波兰算法)过程 从左到右遍历中缀表达式 数字直接输出为后缀表达式一部分 如果是符号,则判断与栈顶元素的优先级 高于栈顶元素优先级直接入栈 低于或等 ...
- java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
- 数据结构实验——中缀表达式转为后缀表达式
一.实验内容: 编写程序,实现中缀表达式化为后缀式输出. 已知中缀表达式中操作数全部用小写英文字母表示,运算符只含有+, -, *, /四种,定界符只有( )以及结束符#. 二.程序源代码: 运行示例 ...
- 九、中缀表达式转为后缀表达式
使用栈将中缀表达式转为后缀表达式并计算 一.中缀表达式转换为后缀表达式 由于后缀表达式适合计算式进行计算,但是人对于较长的中缀表达式,很难将中缀表达式直接转换为后缀表达式,于是我们使用栈来实现中缀表达 ...
- 数据结构——栈——中缀表达式和后缀表达式
什么是中缀表达式,什么是后缀表达式 我们一般看见的多项式计算都是中缀表达式构成的:1+2*3+4/3 类似这种,为什么说是中缀呢?因为它的计算符号都是在两个数中间的. 那么自然而然的明白了后缀表达式是 ...
- 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码
1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...
- 【Weiss】【第03章】练习3.20:中缀表达式转后缀表达式
[练习3.20] a.编写一个程序将中缀表达式转换为后缀表达式,该中缀表达式含括号及四则运算. b.把幂操作符添加到你的指令系统中去. c.编写一个程序将后缀表达式转化为中缀表达式. Answer: ...
最新文章
- install python+twisted+mysqldb+django on mac
- pandas基本数据操作
- ubuntu修改mysql root密码_Ubuntu 下修改mysqlroot密码
- leetCode刷题--两数相加
- 分子克隆基础:什么是质粒
- 浏览器渲染阻塞与优化-详解推迟加载、异步加载。
- Spring Boot中使用模板引擎引用资源
- CSDN怎么换行?添加空行
- 利用Power Designer反向数据库结构
- 如何让imageView铺满屏幕?
- linux wifi信道,2.4G wifi 的频道/信道 20M 40M的概念,区别
- Kinect+unity 实现体感格斗闯关小游戏
- ip地址与long数值互相转换
- DeepStream5.0系列之yolov5使用
- 一文了解云计算,全世界一台计算机
- python处理windows弹窗_python windows弹窗
- 让你的显示器秒变无广告智能电视,泰捷WEBOX 60C电视盒子评测
- 什么是HEIC格式?HEIC图像转换jpg|png方法?
- 解方程AX=b与矩阵分解:奇异值分解(SVD分解) 特征值分解 QR分解 三角分解 LLT分解
- 通过反射解决在HuaWei手机出现Register too many Broadcast Receivers的crash