逆波兰表达式java_采用JAVA对逆波兰表达式解析浅见
本人刚刚学习java不就。知道逆波兰表达式是一个偶然的情况,在用js的时候偶然发现了js中的一个eval函数,数学的表达式它竟然能直接解析出结果。后面通过查询才得知里面的核心是用的逆波兰表达式的算法。后面网上找了一下java的逆波兰表达式算法,没有找到,后面就干脆自己写一个,代码可能有点low希望大牛们可以指导一下。这里引出的逆波兰表达式通过java如何实现。代码:
import java.util.LinkedList;
import java.util.List;
public class ReversePolishNotation {
// 定义一个运算符堆栈character
private static LinkedList characterList = new LinkedList<>();
// 定义一个操作符堆栈operator
private static LinkedList operatorList = new LinkedList<>();
// 定义一个StringBuffer的可变字符串
private static StringBuffer sb = new StringBuffer();
// 定义一个解析表达式结果的集合
private static LinkedList resultList = new LinkedList<>();
/** 逆波兰表达式 以及表达式的运算*/
// 采用java语言对逆波兰表达式进行解析
public static void analysis(String str) {
// 将表达式字符串进行解析
String[] strArr = str.trim().split("");
String strRes = "";
// System.out.println(strArr[0]+"--"+strArr[1]+"--"+strArr[2]);
// 如果是数字就入栈 如果是其他的就对栈顶的进行运算,具体的步骤
// 显示入栈如果遇到运算符将栈顶的元素弹出进行运算得出的结果在入栈依次进行下去
// 如何解决运算符的优先级问题
// 根据元素进行操作
for (String s : strArr) {
if (s.equals("+") || s.equals("-")) {
operatorList.add(strRes.trim());
strRes = "";
// 表示是1级优先级 这个地方需要判断运算符堆栈的堆顶运算符的优先级比较
// 如果比堆顶的优先级高则直接入堆
// 如果比堆顶的优先级低则将堆顶的运算符加入到操作符堆中
// 在继续与下面的比较 如果还是小则重复上面的过程直到加入运算符堆中
priorityCompare(s);
} else if (s.equals("*") || s.equals("/")) {
operatorList.add(strRes.trim());
strRes = "";
priorityCompare(s);
} else if (s.equals("^") || s.equals("%")) {
operatorList.add(strRes.trim());
strRes = "";
priorityCompare(s);
} else if (s.equals("(")) {
operatorList.add(strRes.trim());
strRes = "";
characterList.add(s);
} else if (s.equals(")")) {
operatorList.add(strRes.trim());
strRes = "";
// 合并运算 一直到")"这个括号出现为止 将运算符的元素移动到操作符堆栈中
while (!characterList.peekLast().equals("(")) {
operatorList.add(characterList.pollLast());
}
characterList.removeLast();// 移除"("这个元素
} else {
// 表示是非运算符的处理
strRes = strRes + s;
}
}
if (strRes != "") {
operatorList.add(strRes);
strRes = "";
}
// 将operatorList里面的空元素剔除
while(operatorList.contains("")){
operatorList.remove("");
}
// 循环走过之后应该将运算符中的元素依次移除到操作符堆栈中
String strTmp = "";
while ((strTmp = characterList.pollLast()) != null) {
operatorList.add(strTmp);
}
analysisEquals(operatorList);
}
/** 运算符堆的优先级比较 */
public static void priorityCompare(String s) {
if (transformPriority(s) > transformPriority(characterList.peekLast())) {
// 表示优先级高 加入到运算符堆中
characterList.add(s);
} else {
// 将运算符堆的堆顶元素加入到操作符堆中并继续判断
String str = characterList.pollLast();
if (str != null) {
operatorList.add(str);
priorityCompare(s);
} else {
priorityCompare(s);
}
}
}
/** 优先级的转换 */
public static int transformPriority(String s) {
if (s != null) {
if (s.equals("+") || s.equals("-")) {
return 1;
} else if (s.equals("*") || s.equals("/")) {
return 2;
} else if (s.equals("^") || s.equals("%")) {
return 3;
} else if (s.equals("(")) {
return 0;
} else {
return 0;
}
}
return 0;
}
/** 解析组合式 */
public static void analysisEquals( LinkedList operatorList ) {
// 解析表达式的基本准则 如果遇到运算符就将运算符的前面两个元素和运算符弹出栈
for(String s : operatorList){
if(s.equals("+")||s.equals("-")||s.equals("*")
||s.equals("/")||s.equals("^")||s.equals("%")){
//将结果集的最后面的两个元素弹出并进行运算
Double d1 = Double.parseDouble(resultList.pollLast());
Double d2 = Double.parseDouble(resultList.pollLast());
resultList.add(operation(d2, d1, s).toString());
}else{
resultList.add(s);
}
}
// 将他们进行运算之后在加入中间然后在依次进行运算
System.out.println(resultList);
}
/**逆波兰表达式运算*/
public static Double operation(Double d1,Double d2,String s){
Double dou = 0.0;
switch(s){
case "+":
dou = d1+d2;
break;
case "-":
dou = d1-d2;
break;
case "*":
dou = d1*d2;
break;
case "/":
dou = d1/d2;
break;
case "^":
dou = Math.pow(d1, d2);
break;
case "%":
dou = d1%d2;
break;
}
return dou;
}
public static void main(String[] args) {
// String str = "a+b-(b-d)*e";//=> a,b,b,d,-,e,*,-,+
String str = "(100+(11-(90-18))*5)*0+205%5*0+2*22+((12-3)*5)*0";;
analysis(str);
// 打印一下操作符集合
System.out.println(operatorList);
}
}
代码可能有点乱 不喜欢不要喷 因为一时兴起,所以想保存一下这个就想到写到博客里面了(*^__^*) 嘻嘻,里面有我的一些注解,如果有什么不好的地方 希望私信我。我改成过来。
逆波兰表达式java_采用JAVA对逆波兰表达式解析浅见相关推荐
- java中缀表达式转后缀表达式_数据结构Java实现06----中缀表达式转换为后缀表达式...
本文主要内容: 表达式的三种形式 中缀表达式与后缀表达式转换算法 一.表达式的三种形式: 中缀表达式:运算符放在两个运算对象中间,如:(2+1)*3.我们从小做数学题时,一直使用的就是中缀表达式. 后 ...
- Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)
Java8做出了比较大的更新,支持了很多新特性,Java8引入的Lambda表达式这一特性,使Java8支持函数式编程,目前网上有较多的教程,本文整理了来自Oralce官方提供的教程. Lambda表 ...
- java基础:条件表达式
条件表达式:x=<表达式1>?<表达式2>:<表达式3> 其意义是:先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x.若为0(假),则求解表达式 ...
- 逆波兰式 java_逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)【java实现】...
一.逆波兰式(后缀表达式)计算 思路: * 1.遍历逆波兰式的集合 * 2.当遍历的元素为数字时,入栈 stack * 3.当遍历的元素为运算符时,stack栈弹出两个数,num2 num1,并用该运 ...
- java 实现逆波兰表达式_逆波兰表达式java实现
知道逆波兰表达式是一个偶然的情况,在用js的时候偶然发现了js中的一个eval函数,数学的表达式它竟然能直接解析出结果.后面通过查询才得知里面的核心是用的逆波兰表达式的算法.后面网上找了一下java的 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 使用栈解决的一类经典问题:表达式转换及求值;中缀表达式;前缀表达式,后缀表达式,中缀转前缀;中缀转后缀;后缀表达式求值;波兰式,逆波兰式
文章目录 背景知识 表达式转换问题(考研经典) 一:手工转换 (1)中缀转前缀和中缀转后缀 (2)前缀转中缀和后缀转中缀 二:用栈实现表达式转换 (1)中缀转后缀 (2)中缀转前缀 表达式计算问题(使 ...
- java实现逆波兰算法,基于逆波兰算法实现计算器(Java控制台版)
前言 计算器是日常生活中很常见的工具之一,但并不意味着计算器的软件实现原理就很简单.不少初学的小伙伴在尝试开发计算器的功能时,受到算术表达式中运算符优先级和多层嵌套等问题的困扰.本文采用逆波兰算法来实 ...
- 前缀(波兰表达式) 中缀 后缀(逆波兰表达式)
前缀.中缀.后缀表达式(逆波兰表达式) 本文转自https://www.cnblogs.com/chensongxian/p/7059802.html 介绍 前缀表达式.中缀表达式.后缀表达式都是四则 ...
- Java LinkedHashMap 逆序遍历
利用:ListIterator<pre name="code" class="java">previous 代码如下 public static v ...
最新文章
- CENTOS7 高性能Linux集群 通过yum进行 haproxy配置 !安装 !使用!HAProxy配置文件详解
- 怎么区分IP和MAC?子网掩码有何作用?—Vecloud微云
- python中单引号,双引号,多引号区别
- 如何系统性掌握深度学习中的数据使用
- DNS抓包分析--wireshark
- 【网址收藏】Linux 命令分类(debian Linux)
- mysql性能优化-学习笔记
- timer数据库总显示连接不上服务器,asp.net 上传服务器后,MSSQL数据库连接问题
- 关于Netbeans调试PHP
- windows ad 域下配置L2TP ***服务器 企业防火墙端口配置
- 连接Oracle时报错ORA-28547
- linux忘记mysql密码
- 多智能体强化学习入门Qmix
- matlab中图像格式转换
- 虚拟机kali挂主机代理
- C# 扫描并读取图片中的文字(.NET Core)
- 东大18秋计算机网络在线作业1答案,东大18秋学期《计算机辅助数控编程》在线作业1辅导资料...
- 新版天猫刷红包js代码以及使用方式增加砸金砖代码
- Openwrt Kernel panic - not syncing: Fatal exception 解决方案
- 2017年清华大学计算机科学与技术系考研小结