中缀表达式的实现及概念


每日一笑:
公交车上,一丑女不小心踩了一个男人脚。男人大怒:你再踩一下试试,我让你好看!丑女大喜,急忙又踩了一脚道:太好了大哥,这下不用花钱整容了。

中缀表达式的定义

中缀表达式是一个通用的算术或逻辑公式表示方法。

中缀表达式就是我们通常所理解的数学公式或者是表达式例如:1+2/(1+1)+9*2类似这样简单的加减乘除运算的例子,我们称之为中缀表达式。
形如下图:

以人们的理解思路,便是以中缀形式去走的,更便于理解。但是计算机呢,大多数不是以中缀的方式去存与计算的,对于计算机来讲中缀表达式不便于理解。

中缀表达式的分解过程

例子:

首先我们需要两个容器来分别存放数字类型和字符类型,在这里可以选择栈这一容器,栈是先进后出,后进先出的方式,刚好满足后到先处理,根据优先级判断。

第一步: 一个符号栈operatorStack,一个数字栈numberStack,刚开始栈都为空。


第二步: 识别表达式第一个字符的类型,是符号就入符号栈,如果是数值行就入数字栈,显然左括号是符号,就入符号栈;

第三步: 接着循环下一位,判断出10为数值所以入数字栈。
第四步: +号为字符,入字符栈

第五步: 20为数字,入数字栈

第六步: /为字符,入字符栈

第七步: 2为数字,入数字栈


第八步: *为字符,入字符栈
但是,由于符号栈的栈顶元素为/,优先级和 ✖乘法的优先级相等,但是➗在✖乘号之前 所以要先进行运算,运算之后在入栈。数字栈弹两元素先弹出的作为除数,后弹出的作为被除数。运算结果存入数字栈中。


最后乘号入符号栈

第九步: 3为数字,入数字栈

**第十步:**此时判断为右括号,就说明要将离右括号最近的左括号里面的数字要进行运算,运算结束之后 左括号弹栈,运算结果入栈。



第十一步: /为符号,入符号栈

第十二步: 2为数字入数字栈

第十三步: 除法的优先级高于加法,所以优先处理除法运算。

加法入符号栈

第十四步: 8为数字 进入数字栈,由于8为最后一个元素,所以要进行运算,将运算结果放入到数字栈中,此时的符号栈为空。

到这里中缀表达式的整个分解过程就结束了!,最后表达式的结果便是保存在数字栈中

接下来代码实现

package expression;import java.util.Stack;public class InfixExpression {//中缀表达式public static void main(String[] args) {// TODO 自动生成的方法存根String  expression = "(10+20/2*3)/2+8";int result = evaluteExpression(expression);System.out.println(result);}public static int evaluteExpression(String evaluteExpression) {Stack<Integer> numberStack = new Stack<>();//定义数字栈Stack<Character> operatorStack = new Stack<>();//定义符号栈evaluteExpression = formatExpression(evaluteExpression);//格式化String[] tokens = evaluteExpression.split(" ");//分割字符串为字符数组for(String token:tokens) {//遍历if(token.length()==0) {//如果字符数组为空直接跳过continue;}else if(token.charAt(0)=='(') {//为左括号直接入栈operatorStack.push('(');}else if(token.charAt(0)=='+'||token.charAt(0)=='-') {//为+或为-号时,都要处理符号栈里的元素while(!operatorStack.isEmpty()&&(operatorStack.peek()=='+'||operatorStack.peek()=='-'||operatorStack.peek()=='*'||operatorStack.peek()=='/')) {processAnOperator(operatorStack,numberStack);}operatorStack.push(token.charAt(0));}else if(token.charAt(0)=='*'||token.charAt(0)=='/') {//为*或为/号时,都要处理符号栈里*,/元素while(!operatorStack.isEmpty()&&(operatorStack.peek()=='*'||operatorStack.peek()=='/')) {processAnOperator(operatorStack,numberStack);}operatorStack.push(token.charAt(0));}else if(token.charAt(0)==')') {//为右括号时处理整个括号里的元素值while(operatorStack.peek()!='(') {processAnOperator(operatorStack,numberStack);}operatorStack.pop();}else {//为数值类型numberStack.push(new Integer(token));} }while(!operatorStack.isEmpty()) {//直到符号栈不为空 一直处理processAnOperator(operatorStack,numberStack);}return numberStack.pop();}public static void processAnOperator(Stack<Character> operatorStack,Stack<Integer> numberStack) {//运算处理char ch = operatorStack.pop();int num1 = numberStack.pop();int num2 = numberStack.pop();switch(ch) {case '+':numberStack.push(num2+num1);break;case '-':numberStack.push(num2-num1);break;case '/':numberStack.push(num2/num1);break;case '*':numberStack.push(num2*num1);break;}}public static String formatExpression(String evaluteExpression ) {//格式化StringBuilder sb = new StringBuilder();for(int i=0;i<evaluteExpression.length();i++) {char c = evaluteExpression.charAt(i);if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')') {sb.append(' ');sb.append(c);sb.append(' ');}else {sb.append(c);}}return sb.toString();}}

运行结果:

总结

对于中缀表达式,我们要明确两个观点 一个是需要两个栈来存储数字型元素和符号型元素,遇到符号时判断符号栈是否为空,为空直接入栈,不为空的前提下在判断运算符的优先级,在做处理。最后运算的结果保存在数字栈中,只需弹栈即可!

详细理解中缀表达式并实现相关推荐

  1. 栈应用:中缀表达式求值

    后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...

  2. 中缀表达式转后缀表达式详细思路及代码实现

    什么是中缀表达式? 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(eg:3+4.3+4*2.8+(17-6*2)-.). 为什么要中缀表达式转后缀表达式? 但是中 ...

  3. 前缀表达式,中缀表达式和后缀表达式的定义与联系(超详细)

    目录 前缀.中缀.后缀表达式 前缀表达式 前缀表达式的计算机求值 中缀表达式 后缀表达式 后缀表达式的计算机求值 中缀表达式转化为前缀和后缀表达式 小结 前缀.中缀.后缀表达式 前缀.中缀.后缀表达式 ...

  4. 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)

    用栈实现中缀表达式的求值 步骤: 从左到右扫描,如果扫描到的运算符优先级大于栈顶运算符优先级,则入栈,否则,出栈并运算. 如果遇到右括号,一直出栈,直到遇到左括号为止.并且每一次出栈的运算符都要做一次 ...

  5. 中缀表达式求解——全网最详细教程

    中缀表达式求解 中缀表达式就是我们常见的算术表达式.例如1+2-3这样的式子,在计算机中,我们想要表示这种式子可以用字符串来承载,表示是不费力气的,但是如何求解呢?其实中缀表达式求解问题的思想也很简单 ...

  6. 七、使用栈实现综合计算器(中缀表达式)

    使用栈实现综合计算器(中缀表达式) 1.栈的实际需求 请输入一个表达式,计算式:[722-5+1-5+3-3] ,计算出结果 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看 ...

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

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

  8. 将中缀表达式转化为后缀表达式

    我们把平时所用的标准四则运算表达式,即"9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式" ...

  9. 中缀表达式转换成后缀表达式

    中缀表达式就是我们正常工作中写的表达式,如 a+(b-c)*d ,编译系统将中缀表达式改写 abc-d*+,这种运算符在操作数后面称为后缀表达式(也称逆波兰表达式). 如何实现转换的呢?这里做一下自己 ...

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

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

最新文章

  1. wpf采用Xps实现文档显示、套打功能
  2. CTFshow 命令执行 web60
  3. Java中的双重检查锁定
  4. 计算机网络走向系统化 科学化,第六章计算机网络与INTERNET 应用习题
  5. C++输出九九乘法表
  6. You must install libks to build mod_signalwire
  7. 1489 数据结构:矩阵鞍点
  8. 将输入的字符串逆序输出
  9. vue 滑动置顶功能_CSS3 移动端 滚动置顶 吸顶
  10. CS294(285)策略梯度学习笔记
  11. oracle 截断数据库,Oracle截断表
  12. 算术编码如何将原始数据编码为二进制
  13. 详解FC交换机基础知识
  14. Linux操作系统(笔记)
  15. python习题练习
  16. 云贝餐饮o2o小程序-V2独立版【更新序列至2.5.1】独家修复商家登录/区域代理/分销商/会员卡/积分商城/文章/DIY (可线传)
  17. vue 项目 v-cli3 IE浏览器无法打开app.js 报错解决
  18. 基于Matlab的双馈风力发电机模型
  19. 联想超融合产品暂时没有进军欧美计划
  20. 最大数max(x,y,z)

热门文章

  1. 要毕业了,兄弟也签了工作。。。
  2. UltraWebGrid两种显示样式
  3. 三天打鱼两天晒网(入门级算法)(C语言)
  4. FPGA BCD计数器(多位)
  5. tensorflow 1.14 + cuda10.1 在Ubuntu 16.04上
  6. C语言 实现面向对象
  7. oracle for aix 7,ORACLE 11.2.0.2 RAC for AIX 7.1
  8. 还在为表单搭建而烦恼吗?免费低代码平台足够解忧~
  9. 基于javaweb的学生考勤管理系统(java+SSM+Poi导出+Easyui+JFreeChart+maven+mysql)
  10. matlab 车牌识别源码,车牌识别的matlab程序