算法笔记_044:表达式计算求值(Java)
目录
1 问题描述
2 解决方案
1 问题描述
2 解决方案
具体代码如下:
package com.liuzhen.systemExe;import java.util.Scanner; import java.util.Stack;public class Main{//计算表达式的值public void getExpressionValue(String A){char[] arrayA = A.toCharArray();Stack<Integer> Value = new Stack<Integer>(); //存放运算数字及表达式计算结果Stack<Character> Operator = new Stack<Character>(); //存放运算符for(int i = 0;i < A.length();i++){int temp = 0;if(arrayA[i] >= '0' && arrayA[i] <= '9'){temp = arrayA[i] - '0';i = i + 1;while(i < A.length() && arrayA[i] >= '0' && arrayA[i] <= '9'){temp = temp * 10 + (arrayA[i] - '0');i++;}i--; //对应上面一句i = i+1;因为在for循环中有i++自增操作,若不执行此句,会导致i自增两次 Value.push(temp);}else{if(Operator.empty()){Operator.push(arrayA[i]);}else{char temp1 = Operator.pop(); //进栈前,存放运算符栈中栈顶存放字符int judge = comparePriority(temp1,arrayA[i]); //比较当前字符与栈顶字符优先级if(judge == 1){ //当前字符优先级小于栈顶字符int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);Operator.push(arrayA[i]);}if(judge == 0){ //当前字符优先级大于栈顶字符 Operator.push(temp1);Operator.push(arrayA[i]);}if(judge == 2){ //字符')'遇到'(',刚好使得'('出栈System.out.println("'('刚好遇到')'"); //这种情况也应该不会出现,按照给定优先级,')'一般会先遇到+、-、*、/字符 }if(judge == 3){ //此时')'刚好准备进栈while(temp1 != '('){ //')'字符要等到第一个'('出栈才能结束循环//System.out.println(temp1);int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);temp1 = Operator.pop(); }}if(judge == -1){ //此时,说明当前栈顶字符为')',这是不存在的,因为遇到')',按要求不让进栈System.out.println("出现栈顶有')'错误!!!");}}}}while(!Operator.empty() && !Value.empty()){ //此时,字符栈中还存在运算符的情况char temp1 = Operator.pop();int tempA = Value.pop();int tempB = Value.pop();int result = computeNumber(tempB,tempA,temp1);Value.push(result);}System.out.println(Value.pop()); //此时运算符栈为空,数字栈中只存在表达式计算最终结果 }//计算a operator b的值,operator = {+,-,*,/}public int computeNumber(int a,int b,char operator){int result;switch(operator){case '+': result = a+b;break;case '-':result = a-b;break;case '*': result = a*b;break;case '/': result = a/b;break; default: result = 0;break;}return result;}//判断运算符a和b的优先级public int comparePriority(char a,char b){//使用二维数组表达运算符之间的优先级,行用字符a表示,列用字符b表示int[][] Value = {{1,1,0,0,0,3},{1,1,0,0,0,3},{1,1,1,1,0,3},{1,1,1,1,0,3},{0,0,0,0,0,2},{-1,-1,-1,-1,-1,-1}};int i = 0;int j = 0;if(a == '+')i = 0;if(a == '-')i = 1;if(a == '*')i = 2;if(a == '/')i = 3;if(a == '(')i = 4;if(a == ')')i = 5;if(b == '+')j = 0;if(b == '-')j = 1;if(b == '*')j = 2;if(b == '/')j = 3;if(b == '(')j = 4;if(b == ')')j = 5;return Value[i][j];}public static void main(String[] args){Main test = new Main(); Scanner in = new Scanner(System.in);System.out.println("请输入一个算法表达式:");String A = in.nextLine();test.getExpressionValue(A);} }
运行结果:
请输入一个算法表达式: 1-2+3*(4-5) -4请输入一个算法表达式: 1-2*((2+3)*2-(2+3)) -9请输入一个算法表达式: 1-2*((2+3)*(2+3)) -49
算法笔记_044:表达式计算求值(Java)相关推荐
- c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值
一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...
- [算法 笔记]字符串表达式计算(简易版)
题目:编写一个函数,计算字符串中表达式的值,参数中只包含计算符:+,-,*,/等.例如,str="10+50+2*6/3",result=64. 解析: 考虑算术表达式计算规则: ...
- ffmpeg文档08-表达式计算/求值
8 表达式计算/求值 在计算表达式时,ffmpeg通过libavutil/eval.h接口调用内部计算器进行计算. 表达式可以包含一元运算符.运算符.常数和函数 两个表达式expr1和expr2可以组 ...
- 前缀中缀后缀表达式的计算求值
原文在这里 表达式 前缀表达式(波兰表达式) 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式求值 ...
- 【swjtu】数据结构实验2_中缀表达式的求值算法
实验内容及要求: 从键盘输入中缀表达式,建立操作数与运算符堆栈,计算并输出表达式的求值结果. 基本要求:实现 +, -, *, /四个二元运算符以及():操作数范围为0至9. 提高要求:实现+, -两 ...
- C/C++ 语言中表达式的求值
作者:裘宗燕 北京大学数学学院信息科学系 本文基本内容发表于<编程高手>杂志 2004 年第 12 期 经常可以在一些讨论组里看到下面的提问:"谁知道下面 C 语句给 ...
- C/C++ 语言中表达式的求值
原文http://www.math.pku.edu.cn/teachers/qiuzy/technotes/expression2009.pdf C/C++ 语言中表达式的求值 裘宗燕 北京大学数 ...
- C++——算术表达式的求值(数据结构课程设计)
数据结构课程设计--算术表达式的求值 1.实验目的 1.在课程设计中提高学生的动手能力和编程能力; 2.在课程设计中提高数据结构中理论知识(栈和二叉树等知识)的应用. 3.在课程设计中提高自己对各个方 ...
- 使用堆栈实现对算数四则混合运算表达式的求值(C语言)
使用堆栈实现对算数四则混合运算表达式的求值(C语言) 很方便的目录 使用堆栈实现对算数四则混合运算表达式的求值(C语言) 一.问题分析 基本思路 算符优先级构建 二.算法描述 算法描述 堆栈运算过程的 ...
最新文章
- 【加强版】js原生实现拖拽效果,这次没有用document的mousedown、mousemove、mouseup事件我们来点实际的(但是有个弊端:拖拽过程中鼠标会变成一个禁用符号,不太友好)
- 【迁移学习(Transfer L)全面指南】零次学习(Zero-Shot Learning)入门
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和友元
- 通过NetMassDownloader批量下载和使用微软.NET框架源代码
- 安装oracle 11g 客户端,检查过程中报物理内存不足的解决
- 2021-11-06深度学习
- (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作...
- 2015年8月27日--培训作业是几个练习题
- PHP获取当前脚本内存占用情况
- 标准化考点考场高考英语听力广播系统解决方案
- 性格测试系统v1.0
- 小企业会计准则 ——主要账务处理和财务报表(2)
- border-sizing属性
- Cannot start container web: iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 32797
- Github连接不上怎么办?
- 支付结算周期:D0 D1 T0 T1的区别
- 怎么把图片的边缘弄圆_怎么把图片边角变圆?
- 算法入门四:函数与函数体:
- html七彩文本,小程序解析富文本---文本内容(不含图片)
- Deepin下在线安装和使用ClamAV