本文主要内容:

表达式的三种形式

中缀表达式与后缀表达式转换算法

一、表达式的三种形式:

中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3。我们从小做数学题时,一直使用的就是中缀表达式。

后缀表达式:不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),如:2 1 + 3 *。又比如3+(6-4/2)*5=23的后缀表达式为:3642/-5*+# (#符号为结束符)

前缀表达式:同后缀表达式一样,不包含括号,运算符放在两个运算对象的前面,如:* + 2 1 3 。前缀表达式和后缀表达式其实是差不多的,只不过符号位置不同而已,前缀表达式不是很常见。

二、中缀表达式转换为后缀表达式:(思路)

1、将中缀表达式转换为后缀表达式:(步骤,有点难理解)

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

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

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

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

b.t进栈;

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

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

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

举例:

上图中,左侧的那一列为输出序列,右侧的那一列为栈。

2、运用后缀表达式进行计算:

(1)建立一个栈S;

(2)从左到右读后缀表达式,读到数字就将它转换为数值压入栈S中,读到运算符则从栈中依次弹出两个数分别到Y和X,然后以“X 运算符 Y”的形式计算机出结果,再压加栈S中;

(3)如果后缀表达式未读完,就重复上面过程,最后输出栈顶的数值则为结束。

举例:

3+(2-5)*6/3=-3 ,其后缀表达式为:325-6*3/+。其运算结果如下:

三、代码实现:将中缀表达式转换为后缀表达式

JDK  Stack类使用

使用泛型

代码实现:

(1)StringToArithmetic.java:(中缀表达式转化为后缀表达式的工具类)

1 /**

2 * Created by smyhvae on 2015/9/7.3 * 工具类:4 * 1、中缀表达式转化为后缀表达式5 * 2、给出一个算术表达式(中缀表达式),直接得到计算结果6 */

7

8 importjava.util.Stack;9 importjava.util.regex.Pattern;10

11 public classStringToArithmetic {12

13 privateStringToArithmetic() {14 }15

16 //方法:给出一个算术表达式(中缀表达式),得到计算结果。 例如 (5+8+10)*1,返回23

17 public static doublestringToArithmetic(String string) {18 returnsuffixToArithmetic(infixToSuffix(string));19 }20

21 /**

22 * 中缀表达式转后缀表达式 只处理了+,-,*,/和括号,没有处理负号及其它运算符,也没对前缀表达式验证。23 * 如要处理负号,可对表达式进行预转义处理,当下面条件成立时,将负号换成单目运算符"!" infix.charAt[i]=='-'&&(24 * i==0||infix.charAt[i-1]=='(')25 * 3*6/4+326 * 3+6-4 3 6 + 4 -27 * 3+(6-4/2)*5 3 6 4 2 / - 5 * +28 */

29 //方法:中缀表达式转成后缀表达式

30 public staticString infixToSuffix(String infix) {31 Stack stack = new Stack();32 String suffix = "";33 int length =infix.length();34 for (int i = 0; i < length; i++) {35 Character temp;36 char c =infix.charAt(i);37 switch(c) {38 //忽略空格

39 case ' ':40 break;41 //碰到'(',push到栈

42 case '(':43 stack.push(c);44 break;45 //碰到'+''-',将栈中所有运算符弹出,送到输出队列中

46 case '+':47 case '-':48 while (stack.size() != 0) {49 temp =stack.pop();50 if (temp == '(') {51 stack.push('(');52 break;53 }54 suffix += " " +temp;55 }56 stack.push(c);57 suffix += " ";58 break;59 //碰到'*''/',将栈中所有乘除运算符弹出,送到输出队列中

60 case '*':61 case '/':62 while (stack.size() != 0) {63 temp =stack.pop();64 if (temp == '(' || temp == '+' || temp == '-') {65 stack.push(temp);66 break;67 } else{68 suffix += " " +temp;69 }70 }71 stack.push(c);72 suffix += " ";73 break;74 //碰到右括号,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号

75 case ')':76 while (stack.size() != 0) {77 temp =stack.pop();78 if (temp == '(')79 break;80 else

81 suffix += " " +temp;82 }83 //suffix += " ";

84 break;85 //如果是数字,直接送至输出序列

86 default:87 suffix +=c;88 }89 }90

91 //如果栈不为空,把剩余的运算符依次弹出,送至输出序列。

92 while (stack.size() != 0) {93 suffix += " " +stack.pop();94 }95 returnsuffix;96 }97

98

99 /**

100 * postfix101 *102 *@returndouble103 */

104 //方法:通过后缀表达式求出算术结果

105 public static doublesuffixToArithmetic(String postfix) {106

107 Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); //使用正则表达式 匹配数字

108 String strings[] = postfix.split(" "); //将字符串转化为字符串数组

109 for (int i = 0; i < strings.length; i++)110 strings[i].trim(); //去掉字符串首尾的空格

111 Stack stack = new Stack();112

113 for (int i = 0; i < strings.length; i++) {114

115 if (strings[i].equals(""))116 continue;117

118 //如果是数字,则进栈

119 if((pattern.matcher(strings[i])).matches()) {120

121 stack.push(Double.parseDouble(strings[i]));122 } else{123 //如果是运算符,弹出运算数,计算结果。

124 double y =stack.pop();125 double x =stack.pop();126 stack.push(caculate(x, y, strings[i])); //将运算结果重新压入栈。

127 }128 }129 return stack.pop(); //弹出栈顶元素就是运算最终结果。

130

131 }132

133 private static double caculate(double x, doubley, String simble) {134 if (simble.trim().equals("+"))135 return x +y;136 if (simble.trim().equals("-"))137 return x -y;138 if (simble.trim().equals("*"))139 return x *y;140 if (simble.trim().equals("/"))141 return x /y;142 return 0;143 }144 }

(2)Test.java:(测试类)

1 public classTest {2 public static voidmain(String[] args) {3

4 String str = "3+(2-5)*6/3"; //其后缀表达式为325-6*3/+5

6 //调用方法:中缀表达式转成后缀表达式

7 System.out.println(StringToArithmetic.infixToSuffix(str));8

9 //调用方法:给出一个算术表达式(中缀表达式),得到计算结果

10 System.out.println(StringToArithmetic.stringToArithmetic(str));11

12 }13

14 }

上方代码中,第07行是根据中缀表达式算出后缀表达式。

第10行:是给出一个中缀表达式,直接的到计算结果,其实它的步骤是:先根据中缀表达式得到后缀表达式,然后根据后缀表达式去计算结果。

运行效果:

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

  1. java 数据结构实例_数据结构(Java)——栈的实例

    惟大英雄能本色,是真名士自风流 --易中天(百家讲坛) 1.表达式的转换 1.1 中缀表达式转前缀表达式 中缀表达式转前缀表达式有许多的方式,有加括号去除法.语法树遍历法.堆栈处理法1. 测试程序的实 ...

  2. 表达式类型的实现_程序员如何使代码简洁,Lambda表达式入门之四大引用(下篇)...

    享学课堂特邀作者:老顾转载请声明出处! 前言 上一篇介绍了lambda表达式的语法,今天老顾继续介绍 Lambda类型 Lambda表达式可以被当做是一个Object.Lambda表达式的类型,叫做& ...

  3. Java数据结构第五版期末考试_数据结构(java)期末复习

    [单选题]多基因遗传病的发病风险与下列哪个因素无关 [单选题]一般手锯的往复长度不应小于锯条长度的( ). [判断题]机器上所有;零件都必须进行机械加工. [单选题]一般划线精度能达到( ). [填空 ...

  4. java制作一个简单的画板_【Java】Thymeleaf一个简单示例

    Thymeleaf简单介绍 Thymeleaf是用来开发Web和独立环境项目的服务器端的Java模版引擎 Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemar ...

  5. java语言中声明布尔型_【Java初探02】——Java语言基础

    本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...

  6. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  7. java爬虫中split的使用_关于java中split的使用

    之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊.题目大概是这样的: J ...

  8. 蓝桥杯java能用编译器1吗_学java的你,这些英文单词都掌握了吗?

    1.Abstract class 抽象类:抽象类是不允许实例化的类,因此一般它需要被进行扩展继承. 2.Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法. 3.Anonym ...

  9. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...

    @ 1.异常 1.1 异常概念 异常 :简单说就是不正常运行,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象.Java处 ...

最新文章

  1. 【IBM Tivoli Identity Manager 学习文档】11 TIM设计思路介绍
  2. 【Python】【函数式编程】
  3. 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
  4. asp.net访问sqlserver获取数据、IsPostBack属性和VS可视化调试的概念
  5. Python的运算符和编码
  6. 链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统.pdf
  7. 提升体验-支持Chrome Custom Tabs
  8. vba xml 怎么设置父节点_熊二做了一个xml报文处理的开源库easyxml
  9. javascript 懒加载技术(lazyload)简单实现
  10. prim求最短路径C语言,[图论]Prim算法求最小支撑树和最短路径
  11. 二项分布的期望方差证明
  12. python zip函数小结
  13. Java web前端——HTML常用标签
  14. matplotlib.pyplot.scatter( )绘制散点图与双月形图
  15. 魅力主播曹启泰《上班这点事》经典语录
  16. 面向对象OO第一单元三次作业总结
  17. Linux之日志服务及管理
  18. html clear 清楚li,CSS清楚浮动clear:both
  19. 是傻频日志呵阡啄凛仄
  20. 史上最长最全!围绕故障管理谈SRE体系建设

热门文章

  1. 【实习】京东搜索相关性算法部门
  2. T-PAMI 2021 | 换个损失函数就能实现数据扩增?
  3. Hinton 新作!越大的自监督模型,半监督学习需要的标签越少
  4. Nature封面论文创意被剽窃?UC圣迭戈付向东实名举报中科院研究员抄袭
  5. 分布式事务篇——第二章:分布式事务解决之2PC剖析
  6. python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))
  7. ubuntu18.04 实现中文化 中文输入法
  8. HTML基础部分(2)表格
  9. 经验 | 深度学习优化背后的数学基础
  10. 实战|基于图割算法的木材表面缺陷图像分析