详细理解中缀表达式并实现
中缀表达式的实现及概念
每日一笑:
公交车上,一丑女不小心踩了一个男人脚。男人大怒:你再踩一下试试,我让你好看!丑女大喜,急忙又踩了一脚道:太好了大哥,这下不用花钱整容了。
中缀表达式的定义
中缀表达式是一个通用的算术或逻辑公式表示方法。
中缀表达式就是我们通常所理解的数学公式或者是表达式例如: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();}}
运行结果:
总结
对于中缀表达式,我们要明确两个观点 一个是需要两个栈来存储数字型元素和符号型元素,遇到符号时判断符号栈是否为空,为空直接入栈,不为空的前提下在判断运算符的优先级,在做处理。最后运算的结果保存在数字栈中,只需弹栈即可!
详细理解中缀表达式并实现相关推荐
- 栈应用:中缀表达式求值
后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...
- 中缀表达式转后缀表达式详细思路及代码实现
什么是中缀表达式? 中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(eg:3+4.3+4*2.8+(17-6*2)-.). 为什么要中缀表达式转后缀表达式? 但是中 ...
- 前缀表达式,中缀表达式和后缀表达式的定义与联系(超详细)
目录 前缀.中缀.后缀表达式 前缀表达式 前缀表达式的计算机求值 中缀表达式 后缀表达式 后缀表达式的计算机求值 中缀表达式转化为前缀和后缀表达式 小结 前缀.中缀.后缀表达式 前缀.中缀.后缀表达式 ...
- 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)
用栈实现中缀表达式的求值 步骤: 从左到右扫描,如果扫描到的运算符优先级大于栈顶运算符优先级,则入栈,否则,出栈并运算. 如果遇到右括号,一直出栈,直到遇到左括号为止.并且每一次出栈的运算符都要做一次 ...
- 中缀表达式求解——全网最详细教程
中缀表达式求解 中缀表达式就是我们常见的算术表达式.例如1+2-3这样的式子,在计算机中,我们想要表示这种式子可以用字符串来承载,表示是不费力气的,但是如何求解呢?其实中缀表达式求解问题的思想也很简单 ...
- 七、使用栈实现综合计算器(中缀表达式)
使用栈实现综合计算器(中缀表达式) 1.栈的实际需求 请输入一个表达式,计算式:[722-5+1-5+3-3] ,计算出结果 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看 ...
- java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
- 将中缀表达式转化为后缀表达式
我们把平时所用的标准四则运算表达式,即"9+(3-1)*3+10/2"叫做中缀表达式.因为所有的运算符号都在两数字的中间,现在我们的问题就是中缀到后缀的转化. 中缀表达式" ...
- 中缀表达式转换成后缀表达式
中缀表达式就是我们正常工作中写的表达式,如 a+(b-c)*d ,编译系统将中缀表达式改写 abc-d*+,这种运算符在操作数后面称为后缀表达式(也称逆波兰表达式). 如何实现转换的呢?这里做一下自己 ...
- 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码
1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...
最新文章
- wpf采用Xps实现文档显示、套打功能
- CTFshow 命令执行 web60
- Java中的双重检查锁定
- 计算机网络走向系统化 科学化,第六章计算机网络与INTERNET 应用习题
- C++输出九九乘法表
- You must install libks to build mod_signalwire
- 1489 数据结构:矩阵鞍点
- 将输入的字符串逆序输出
- vue 滑动置顶功能_CSS3 移动端 滚动置顶 吸顶
- CS294(285)策略梯度学习笔记
- oracle 截断数据库,Oracle截断表
- 算术编码如何将原始数据编码为二进制
- 详解FC交换机基础知识
- Linux操作系统(笔记)
- python习题练习
- 云贝餐饮o2o小程序-V2独立版【更新序列至2.5.1】独家修复商家登录/区域代理/分销商/会员卡/积分商城/文章/DIY (可线传)
- vue 项目 v-cli3 IE浏览器无法打开app.js 报错解决
- 基于Matlab的双馈风力发电机模型
- 联想超融合产品暂时没有进军欧美计划
- 最大数max(x,y,z)
热门文章
- 要毕业了,兄弟也签了工作。。。
- UltraWebGrid两种显示样式
- 三天打鱼两天晒网(入门级算法)(C语言)
- FPGA BCD计数器(多位)
- tensorflow 1.14 + cuda10.1 在Ubuntu 16.04上
- C语言 实现面向对象
- oracle for aix 7,ORACLE 11.2.0.2 RAC for AIX 7.1
- 还在为表单搭建而烦恼吗?免费低代码平台足够解忧~
- 基于javaweb的学生考勤管理系统(java+SSM+Poi导出+Easyui+JFreeChart+maven+mysql)
- matlab 车牌识别源码,车牌识别的matlab程序