首先要知道什么是前缀表达式,什么是中缀表达式,什么是后缀表达式

所谓的中缀表达式就是类似于这种的运算 1+((2+3)×4)-5

所谓的前缀表达式就是符号在两个操作数的前面 - + 1 × + 2 3 4 5

所谓的后缀表达式就是两个数在运算符的右边 3 4 + 5 × 6 -

这样我们就知道了前中后缀表达式所代表的含义是什么,在我们人的脑子看来,这个是一个很简单的运算操作,但是你要把他放在电脑上面,中缀表达式我感觉是比较难的,因为你要考虑运算符的优先级,括号的情况等等,我们可以将其转换成为前缀表达式或者后缀表达式来进行操作,其实原理都是一样的。

我们这里用前缀表达式做例子:

我们使用一个栈来运算,我们的优先顺序是从右往左遍历

  1. 当遇到数字的时候,压栈
  2. 当遇到运算符的时候,栈顶的两个元素出栈,计算之后再入栈

就像我们的

-×+3456
  1. 遇到6,压栈
  2. 遇到5,压栈
  3. 遇到4,压栈
  4. 遇到3,压栈
  5. 遇到+,取出栈顶的3和4,计算之后,压栈
  6. 遇到*,取出栈顶的7和5,计算之后,压栈
  7. 遇到-,取出栈顶的35和6,计算之后,压栈
  8. 最后存在栈里面的就是最终的结果
package com.zhongruan.testDemo;import java.util.*;/*** @author weirdo* @date 2020-10-30 11:24* @email 1435380700@qq.com*/
public class Main {public static void main(String[] args) {Main m = new Main();String str = "-×+3456";System.out.println(m.preCalculate(str));}/*** 通过前缀表达式求值* 从右到左扫描,扫到数字进栈,扫到操作运算符就取出两个,进行计算然后压栈* @param str* @return*/public int preCalculate(String str){//bianliStack<Integer> number = new Stack<>();for(int i=str.length()-1;i>=0;i--){if(str.charAt(i)>='0' && str.charAt(i)<='9'){number.push(str.charAt(i)-'0');}else{switch (str.charAt(i)){case '+':{int num1 = number.pop();int num2 = number.pop();number.push(num1+num2);break;}case '-':{int num1 = number.pop();int num2 = number.pop();number.push(num1-num2);break;}case '×':{int num1 = number.pop();int num2 = number.pop();number.push(num1*num2);break;}case '/':{int num1 = number.pop();int num2 = number.pop();number.push(num1/num2);break;}default:break;}}}//最后应该只剩下一个数字return number.pop();}}

那么我们的中缀表达式这么变成前缀表达式/后缀表达式呢?其实都是一样的,一个正序,一个倒序。。

我们使用两个栈,stack1 和 stack2 来存储

  1. 将前缀表达式从后往前遍历,如果当前的是数字的话,压入stack1
  2. 如果是操作运算符的话,且stack2为空的话,直接压栈
  3. 否则则要比较运算符的优先级(第一优先级()、第二优先级* /、第三优先级 + -)
  4. 如果当前的优先级比栈顶的运算符优先级高的话,则栈顶的运算符出栈stack1.push(stack2.pop());
  5. 最后将stack2种的数字压入stack1,得到的就是后缀表达式,反转一下就是前缀表达式
package com.zhongruan.testDemo;import java.util.*;/*** @author weirdo* @date 2020-10-30 11:24* @email 1435380700@qq.com*/
public class Main {public static void main(String[] args) {Main m = new Main();
//        String str = "-×+3456";
//        System.out.println(m.preCalculate(str));System.out.println(m.toPreExpression("1+((2+3)*4)-5"));System.out.println("- + 1 × + 2 3 4 5");}/*** 通过前缀表达式求值* 从右到左扫描,扫到数字进栈,扫到操作运算符就取出两个,进行计算然后压栈* @param str* @return*/public int preCalculate(String str){//bianliStack<Integer> number = new Stack<>();for(int i=str.length()-1;i>=0;i--){if(str.charAt(i)>='0' && str.charAt(i)<='9'){number.push(str.charAt(i)-'0');}else{switch (str.charAt(i)){case '+':{int num1 = number.pop();int num2 = number.pop();number.push(num1+num2);break;}case '-':{int num1 = number.pop();int num2 = number.pop();number.push(num1-num2);break;}case '×':{int num1 = number.pop();int num2 = number.pop();number.push(num1*num2);break;}case '/':{int num1 = number.pop();int num2 = number.pop();number.push(num1/num2);break;}default:break;}}}//最后应该只剩下一个数字return number.pop();}/*** 中缀表达式转化成为前缀表达式* @return*/public String toPreExpression(String str){Map<Character,Integer> map = new HashMap<>();map.put('+',0);map.put('-',0);map.put('*',1);map.put('/',1);map.put(')',2);Stack<Character> stack1 = new Stack<>();Stack<Character> stack2 = new Stack<>();for(int i=str.length()-1;i>=0;i--){char c = str.charAt(i);if(c >='0' && c <='9'){//如果是数字stack1.push(c);}else{if(stack2.isEmpty()){stack2.push(c);}else{if(c==')'){stack2.push(c);}else if(c=='('){while (stack2.peek()!=')' && !stack2.isEmpty()){stack1.push(stack2.pop());}stack2.pop();}else{//比较运算符优先级while (!stack2.isEmpty() && map.get(stack2.peek())<map.get(c)){stack1.push(stack2.pop());}stack2.push(c);}}}}while (!stack2.isEmpty()){stack1.push(stack2.pop());}return stack1.toString();}}

前缀表达式计算、中缀表达式计算、后缀表达式计算相关推荐

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

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

  2. 算术表达式的前缀式、中缀式、后缀式相互转换

    中缀表达式(中缀记法) 中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间.中缀表达式是人们常用的算术表示方法. 虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀 ...

  3. 中缀转后缀表达式,带括号的后缀表达式综合计算器,Java栈数据结构实现

    文章目录 中缀表达式转后缀表达式思路 逆波兰表达式计算思路 代码实现 中缀表达式转后缀表达式思路 1.初始化两个栈:运算符栈s1和储存中间结果的栈s2 2.从左至右扫描中缀表达式 3.遇到操作数时,将 ...

  4. 语法树,前缀式,中缀式,后缀式

    前序遍历:根左右 中序遍历:左根右 后序遍历:左右根 前缀式:+AB 中缀式:A+B 后缀式:AB+ 例题一: 前序遍历(前缀式):- + 4 * 1 - 5 2 / 6 3 根在前,从最后开始:-5 ...

  5. 天勤数据结构:前缀、中缀、后缀表达式的转换与计算

    第三章 栈和队列 1. 输出队列问题 2. 表达式的转换 - 手工转换 2.1 中缀表达式 转 前缀表达式 2.2 中缀表达式 转 后缀表达式 2.3 后缀表达式 转 中缀表达式 2.4 后缀表达式 ...

  6. 中缀表达式计算、后缀表达式计算、中缀转后缀

    代码来源 : bilibili网站 :https://www.bilibili.com/video/av91996256?from=search&seid=174497233083020298 ...

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

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

  8. java简易计算机(用栈实现中缀转后缀,计算后缀表达式)

    这学期java课的一个小作业,用java编一个小计算器. 个人认为要点在于: 1.计算机的布局,即按钮和输出框的布局需要知道怎么操作,按钮的大小和字体的大小颜色.不同布局中按钮的改变大小等等 2.用栈 ...

  9. 数据结构:前缀,中缀,后缀表达式(逆波兰表达式)

    前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前. 比如 (1+2)*3-4  对应的前缀表达式就是: - * + 1 2 3 4 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,就 ...

  10. 前缀、中缀、后缀表达式(转载)

    关键字:概念, 前缀表达式, 前缀记法, 中缀表达式, 中缀记法, 波兰式, 后缀表达式, 后缀记法, 逆波兰式 它们都是对表达式的记法,因此也被称为前缀记法.中缀记法和后缀记法.它们之间的区别在于运 ...

最新文章

  1. 『TensorFlow』函数查询列表_张量属性调整
  2. python字符串与数字互相转换
  3. c++11 多线程编程(二)------ 线程类构造函数深入理解
  4. 三种方式实现Java对象转json下划线格式
  5. [Bada开发]基于bada1.0的5种控件介绍[待续]
  6. echarts图例动态置灰
  7. error: ‘xcb_generic_event_t’ was not declared in this scope
  8. 组装一台个人深度学习工作站/科学计算主机
  9. 车牌号归属地查询,免费API
  10. SpringBoot整合Quartz--使用/教程/实例
  11. 在SAP系统中,更改一个公司代码(Company Code)的会计科目表(Chart of Accounts)
  12. FL Studio教程之Gross Beat插件讲解
  13. wxpython入门(1)
  14. 安天移动安全应对“DressCode”威胁,发布企业移动威胁检查工具
  15. 数据可视化优秀作品欣赏
  16. 小红书数据监测,品牌方必看的笔记投放技巧!
  17. 正则匹配中文与邮箱的写法
  18. WZOI-297数的三次方根
  19. 阿里云技术认证ACP是什么?阿里ACP认证需要具备哪些知识?
  20. 解决steam下载速度过慢的问题

热门文章

  1. vista 系统问题
  2. Telerik控件2022版,到端测试自动化工具
  3. cfd post session, 自动, 批量 , 后处理计算结果,
  4. 开源数据挖掘工具Orange简介
  5. 免费版对象存储【minIO】CentOS部署实践记录 2021
  6. cocos2dx 3.17海外sdk接入填坑全纪录 SdkBox IAP SDK 接入(4)
  7. FreeSwitch Event Socket Command
  8. 七、Redis集群搭建
  9. 怎样一键生成微信跳转链接,可以自动跳转浏览器打开URL网页
  10. python modbus tk 库_Python Modbus_tk在树莓派上实现rtu master