中缀表达式求值 Java
什么是中缀表达式;
中缀表达式的计算逻辑;
例:(10+20/2*3)/2+8
我们要按照四则运算的逻辑进行计算;
(1)先计算括号内的计算单元,而内部的计算单元必须要按照四则运算的优先级来进行即先乘除
后加减;
(2)运算完括号内部之后再从左向右依次计算,同时保证先乘除后加减的运算法则;
算法逻辑;
因为我们要满足运算的优先级,所以我们可以利用栈 先进后出 的特点控制运算单元的优先级
所以我们可以声明两个栈一个栈负责运算的存储,另一个栈负责数字的存储。此时通过符号栈的入
栈和出栈的顺序和数字栈提供的运算数字就可以实现运算单元优先级。
栈的创建;
数据的存入;
将中缀表达式赋值给 String expression = (10+20/2*3)/2+8
遍历字符串给( ,),+,-,*,/ 符号两端加上空格,数字不加,拼接成新的字符串;再
利用split(“ ”)方法,通过空格将新字符串分割位String [],遍历数组存入对应栈(具体方法代
码中体现)注意:运算符存入时应在保证优先级的前提下;
值得计算;
operatorStack 弹一个运算符,numberStack弹两个数字 num1,num2;同时注意两个数字和
运算符的顺序;应保证为此形式 num2 运算符 num1;
注意:数据计算时,弹栈的过程中应符合运算逻辑以及运算优先级(具体实现代码中体现)
代码如下;
package p2.线性结构;
//中缀表达式计算器
public class InfixCalculator {public static void main(String[] args) {String expression = "(10+20/2*3)/2+8";try {int result = evaluateExpression(expression);System.out.println(result);} catch (Exception e) {e.printStackTrace();System.out.println("Wrong expression :" + expression);}}private static int evaluateExpression(String expression) {//需要两个辅助栈ArrayStack<Character> operatorStack = new ArrayStack<>();ArrayStack<Integer> numberStack = new ArrayStack<>();//格式化表达式expression = insertBlanks(expression);String[] tokens = expression.split(" ");for (String token : tokens) { //token == tokens[i]//过滤空串if (token.length() == 0) {continue;//遍历到 + - 号} else if (token.equals("+") || token.equals("-")) {while (!operatorStack.isEmpty() && (operatorStack.peek() == '+' || operatorStack.peek() == '-' || operatorStack.peek() == '*' || operatorStack.peek() == '/')) {//如果之前是别的+ - * / 则需要弹栈 并计算processAnOperator(numberStack, operatorStack);}//如果操作符栈为空 或者 不为空但栈顶为(operatorStack.push(token.charAt(0));//遍历到 * / 号} else if (token.equals("*") || token.equals("/")) {while (!operatorStack.isEmpty() && (operatorStack.peek() == '*' || operatorStack.peek() == '/')) {//如果之前是别的* / 则需要弹栈 并计算processAnOperator(numberStack, operatorStack);}//如果操作符栈为空 或者 不为空但栈顶为(operatorStack.push(token.charAt(0));//遍历到 (} else if (token.equals("(")) {operatorStack.push(token.charAt(0));//遍历到 )} else if (token.equals(")")) {//只要操作符栈的栈顶不是左括号( 就挨个弹栈计算即可while (operatorStack.peek() != '(') {processAnOperator(numberStack, operatorStack);}//最后 清掉左括号operatorStack.pop();//遍历到数字} else {numberStack.push(new Integer(token));}}//处理最后面的操作符while (!operatorStack.isEmpty()) {processAnOperator(numberStack, operatorStack);}return numberStack.pop();}//操作符栈弹栈一个元素 数字栈弹栈两个数字 进行计算 并将新的结果进栈到数字栈private static void processAnOperator(ArrayStack<Integer> numberStack, ArrayStack<Character> operatorStack) {char op = operatorStack.pop();int num1 = numberStack.pop();int num2 = numberStack.pop();//num2 op num1if (op == '+') {numberStack.push(num2 + num1);} else if (op == '-') {numberStack.push(num2 - num1);} else if (op == '*') {numberStack.push(num2 * num1);} else {numberStack.push(num2 / num1);}}//对原表达式进行格式化处理 给所有的非数字字符两边添加空格private static String insertBlanks(String expression) {StringBuilder sb = new StringBuilder();for (int i = 0; i < expression.length(); i++) {char c = expression.charAt(i);if (c == '(' || c == ')' || c == '+' || c == '-' || c == '*' || c == '/') {sb.append(' ');sb.append(c);sb.append(' ');} else {sb.append(c);}}return sb.toString();}
}
例题中的中缀表达式结果为
(10+20/2*3)/2+8=28;
代码运行结果;
由此可知代码实现了中缀表达式的计算;
中缀表达式求值 Java相关推荐
- leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)
题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...
- leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)
题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...
- leetcode 224. Basic Calculator | 224. 基本计算器(中缀表达式求值)
题目 https://leetcode.com/problems/basic-calculator/ 题解 中缀表达式求值,之前学数据结构的笔记: class Solution {public int ...
- C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式)
C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式) 样例输入:3*(2+5) 样例输出:21 代码:#include <bits/stdc++.h> using namespace ...
- DSOJ 中缀表达式求值
题目链接 #include<stdio.h> //中缀表达式求值 #include<string.h> #include<stdlib.h> #define MAX ...
- Python实现中缀表达式求值
一.思路 有些类似于先把中缀表达式转化为后缀表达式,然后再对后缀表达式求值.但是因为我们最终只需要求出来的值,不想得到后缀表达式,所以就一边遍历一边计算了.关键点在于,我们借助两个栈,一个栈存放操作数 ...
- 栈应用:中缀表达式求值
后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...
- c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...
文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...
- c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)
第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...
最新文章
- Windows10 + VS2015 环境下对gdal2.0.1进行64bit编译小结
- python3知识点之---------字符串的介绍
- 数据科学和人工智能技术笔记 二、数据准备
- 【Caffe】训练ImageNet模型
- 清理SQL Server中的旧代码和未使用的对象
- 【工具相关】Web-Sublime Text2的用法(一)
- (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试
- MySQL join 与where的执行顺序
- 翻译: 自动驾驶汽车技术:自动驾驶汽车如何工作?
- Java项目:SSM会议室预约系统
- 【C语言】十进制转换二进制
- 字节跳动大裁员,测试工程师差点遭团灭:大厂招人背后的套路,有多可怕?
- 简述74HC595功能
- Word文档基本操作
- android studio调试,华为手机连接电脑找不到HDB interface的解决方案
- Qt基础与Qt on Android入门-安晓辉-专题视频课程
- linux 只读文件 删除,linux – 我无法删除文件’rm:无法删除X只读文件系统’
- WLAN使用的功率单位
- NameValuePair和BasicNameValuePair的关系
- RDP报表工具v2.3.*版本升级操作步骤
热门文章
- 离线Cesium客户端
- EOJ 1424/FOJ 1171/POJ 2572/ZOJ 1969/Ulm Local 2001 Hard to Believe, but True!
- VirtualBox之vdi、vhd、vmdk虚拟硬盘格式相互转换
- 莆田系开战百度 谁动了谁的奶酪?
- 生产制造业网络运维监控方案
- 2021年汽车修理工(中级)考试APP及汽车修理工(中级)新版试题
- Java在线教育项目 第三天文章详情前后端成形记
- php fpm 日志级别,php-fpm的pool、php-fpm慢执行日志、 php-fpm定义open_basedir、php-fpm进程管理...
- vue table v-for v-for其他用法
- 商城系统功能需求分析_免费搭建方式介绍_OctShop