文章目录

  • 前言
  • 一、后缀表达式
  • 二、中缀转后缀 方式
  • 三、中缀 转 后缀 并计算 实现
  • 四、总结

前言

中缀表达式就是我们在进行加减乘除时经常使用的表达式,后缀表达式是对计算机友好的表达式,计算机可以利用两个栈来实现输入的计算字符串的计算工作


提示:以下是本篇文章正文内容,下面案例可供参考

一、后缀表达式

后缀表达式也叫逆波兰式,实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。
       (a+b)c-(a+b)/e的后缀表达式为:ab+cab+e/-

二、中缀转后缀 方式

首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为存放结果(逆波兰式)的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端开始取字符,逐序进行如下步骤:

  1. 若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈。
  2. 若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符(不包括括号运算符)优先级高于S1栈栈顶运算符(包括左括号)优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符(包括左括号)低于(不包括等于)该运算符优先级时停止弹出运算符,最后将该运算符送入S1栈。
  3. 若取出的字符是“(”,则直接送入S1栈顶。
  4. 若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。
  5. 重复上面的1~4步,直至处理完所有的输入字符。
  6. 若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。

计算示例

三、中缀 转 后缀 并计算 实现

public class testPolan {public static void main(String[] args) {String exp = "1+((12+0)*4)-5";List<String> infixExpressionList = toInfixExpressionList(exp);List<String> suffixExpressionList = parseSuffixExpressionList(infixExpressionList);System.out.println("后缀List" + suffixExpressionList);System.out.printf(exp + " = " + calculate(suffixExpressionList));}//方法:将中缀转后缀public static List<String> parseSuffixExpressionList(List<String> ls) {//定义两个栈Stack<String> s1 = new Stack<String>();//符号栈//因为s2这个栈没有pop,后面还要逆序输出//因此比较麻烦,我们直接使用List2List<String> s2 = new ArrayList<String>();//遍历lsfor (String item : ls) {//如果是一个数就加入s2if (item.matches("\\d+")) {s2.add(item);} else if (item.equals("(")) {s1.push(item);} else if (item.equals(")")) {while (!s1.peek().equals("(")) {s2.add(s1.pop());}s1.pop();//将小括号弹出} else {//item的运算符优先级小于等于栈顶//缺少优先级方法,见下while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) {s2.add(s1.pop());}//还需要将item压入栈中s1.push(item);}}//将s1剩余的加入s2while (s1.size() != 0) {s2.add(s1.pop());}return s2;}//方法:将中缀表达式转成对应的Listpublic static List<String> toInfixExpressionList(String s) {//先定义一个list存放中缀表达式对应的数据List<String> ls = new ArrayList<String>();int i = 0;//这是一个指针,用于遍历中缀表达式字符串String str;//多位数的拼接char c;//每遍历一个字符就放到c中do {//如果c是非数字,我们就加到lsif ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) > 57) {ls.add("" + c);i++;} else {//考虑多位数str = "";while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) <= 57) {str += c;i++;}ls.add(str);}} while (i < s.length());return ls;}//从左往右扫描表达式,遇到数字时,将数字压入堆栈//遇到运算符时,弹出栈顶的两个数,计算//注意顺序:次顶元素 -处理->栈顶元素//并将结果入栈,重复上述过程直到表达式最右端//最后结果即为计算结果public static int calculate(List<String> ls) {Stack<String> stack = new Stack<String>();//遍历lsfor (String item : ls) {if (item.matches("\\d+")) {//入栈stack.push(item);} else {int num2 = Integer.parseInt(stack.pop());int num1 = Integer.parseInt(stack.pop());int res = 0;if (item.equals("+")) {res = num1 + num2;} else if (item.equals("-")) {res = num1 - num2;} else if (item.equals("*")) {res = num1 * num2;} else if (item.equals("/")) {res = num1 / num2;} else {throw new RuntimeException("错误");}stack.push(res + "");}}return Integer.parseInt(stack.pop());}//类:返回优先级数字static class Operation {private static int ADD = 1;private static int SUB = 1;private static int MUL = 2;private static int DIV = 2;//方法,返回对应的优先数字public static int getValue(String oper) {int result = 0;switch (oper) {case "+":result = ADD;break;case "-":result = SUB;break;case "*":result = MUL;break;case "/":result = DIV;default:
//                System.out.println("无法解析");break;}return result;}}}

四、总结

加油噢!

中缀 转 后缀 实现计算相关推荐

  1. 数据结构之栈实现中缀转后缀并计算结果

    一.中缀变后缀过程分析 给定一个中缀,最后变为后缀的过程其实并不算复杂,下面分析一下过程: 1. 首先面对一个中缀表达式,我们需要两个栈,一个用来存放运算符,即符号栈 operatorstack,一个 ...

  2. C语言实现中缀转后缀并计算表达式结果

    文章目录 一.问题描述 二.AC代码 三.注意点 四.实现思路/代码解析 一.问题描述 [问题描述] 从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2   ...

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

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

  4. java 中缀转后缀并计算_Java实现表达式计算(中缀转后缀)

    定义: 中缀表达式:我们平时写的数学表达式一般为中缀表达式,如"5+2*(3*(3-1*2+1))",直接拿中缀表达式直接让计算机计算表达式的结果并不能做到. 后缀表达式:把中缀表 ...

  5. 顺序栈计算器 中缀转后缀表达式

    顺序栈计算器 中缀转后缀表达式 前言 一.后缀表达式简述 二.参考书目中的函数实现 1.输入一个后缀表达式并计算 2.将中缀转后缀表达式 三.在原方法基础上改写并结合两个方法 1.输入一个后缀表达式并 ...

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

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

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

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

  8. 中缀转后缀表达式并计算

    注:本博客是基于<数据结构>这门课,主要是为了自己考研,准备专业课 图解转自:中缀转后缀算法 中缀转后缀算法 中缀表达式转后缀表达式遵循以下原则: 遇到操作数,直接输出 当栈为空时,若遇到 ...

  9. 中缀转后缀并分别计算

    参考了几篇大佬的文章最后写出,通过Android studio实现. 只实现个位整数+-*/,如有更多需求,请自行修改. Cal(中缀转后缀) public class Cal {LinkedList ...

最新文章

  1. 01-mybatis源码阅读
  2. 解决vue项目eslint校验 Do not use ‘new‘ for side effects 的两种方法
  3. html里range怎么改样式,CSS之修改input range样式 [ lion1ou ]
  4. 几种常用的JS类定义方法
  5. 数学建模——评卷问题
  6. 想成为BAT中的一员,你总要去学点什么(一)
  7. TasksetManager冲突导致SparkContext异常关闭
  8. 经过几天的Scala回归Java的10个最烦人的事情
  9. 三步彻底清除电脑的mysql
  10. java创建hbase多个列族_Spark:DataFrame写HFile (Hbase)一个列族、一个列扩展一个列族、多个列...
  11. Artlantis studio 2021 for Mac(三维渲染工具)
  12. 【夯实PHP基础】PHP发送邮件(PHPMailer)
  13. FastReport.Net使用:[23]图表(Chart)控件
  14. 沪台教师携手“播种”传统文化 让中华文明浸润孩子
  15. PHP将日期转换为时间戳方式,php日期转换为时间戳的方法
  16. 系统辨识总论(System Identification)
  17. 简单的Wifi密码破解
  18. 你知道 biangbiang 面和编码有什么关系吗?万字长文,手拉手带你一步步认识编码
  19. oracle 考试资料,Oracle考试复习题
  20. HTML文字样式显示闪烁,怎么纯用css代码使文字展示闪动效果?(代码示例)

热门文章

  1. idea安装lua编辑插件Emmylua
  2. 深度学习常用的激活函数以及python实现(Sigmoid、Tanh、ReLU、Softmax、Leaky ReLU、ELU、PReLU、Swish、Squareplus)
  3. 《区块链基础知识25讲》学习笔记——第一部分区块链术语与技术基础
  4. Franka Emika新款机器人FP3震撼发布,带来全新生态,重新定义协作机器人
  5. 盒模型BFC渲染机制
  6. PR片头模板,创意设计品牌形象LOGO生长动画视频片头模板
  7. 如何获取要的收盘价 定投收益最后 计算方法
  8. 浙大学生论文:Dota护甲系统完全解析
  9. 1.1 操作系统的目标和作用
  10. java jstack prio,tid,nid 参数含义