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问题2:请帮我改作业——表达式问题
1) y += z-- / -+x; 相当于y = y + ((z--) / (x * 1 * -1)) = 2 + (3/-1) = 2 + (-3) = -1 第3.4题先把十进制转成二进制,再列 ...
- 南邮java大作业实验报告_南京邮电大学java第三次实验报告
实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 4 月 ...
- java编程实现素数环_结对编程(JAVA实现)
项目成员:黄思扬(3117004657).刘嘉媚(3217004685) 二.PSP表格 PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟) Pla ...
- java犀牛是什么意思_深入浅出Rhino:Java与JS互操作
2011年10月6日,一年一度的JavaOne大会隆重举行.JavaOne2011大会的主题之一介绍针对不同Java平台的产品路线图,这其中包括移动版(ME,Micro Edition).标准版(SE ...
- java 嵌入式 类型工具库_你常用的Java工具库都有哪些?
Java命令行选项解析之Commons-CLI & Args4J & JCommander详细内容 Java调用Native API之JNA详细内容 Java执行SSH/SCP之JSc ...
- java国际化 英语的标识符_(转)Java 国际化
1. Java国际化简介 Java既然作为一个跨平台的语言就必然要在各种不同的语言环境中使用, 为了解决这个问题Java给我们提供了一个工具类ResourceBundle, 帮助我们实现Java的国际 ...
- lambda表达式_带Lambda表达式的Apache Wicket
lambda表达式 这是怎么回事? :) 我一直在从事一些项目,这些项目值得庆幸的是将Apache Wicket用于表示层. 我自然而然地想到了Java的8个lambda表达式如何与Wicket完美契 ...
- java 正负号数值比较_从零学java笔录-第10篇 数据类型(四)
从零学java笔录-第10篇 数据类型(四) 凯哥Java 凯哥java 本文是<凯哥陪你学系列之java基础篇> 感谢: 感谢网友:志远162.在上一篇中对错误指出. 在上篇中模运算正负 ...
- java while语句打印三角形_小猿圈Java循环嵌套语法的使用介绍
Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...
- java编写代码用什么_如何学习用Java编写代码:为什么要学习以及从哪里开始
java编写代码用什么 by John Selawsky 约翰·塞劳斯基(John Selawsky) 如何学习用Java编写代码:为什么要学习以及从哪里开始 (How to learn to cod ...
最新文章
- 升级 Java 编程规范的6个约定
- Tungsten Fabric SDN — 与 OpenStack 的集成部署
- 网络安全与机器学习(二):网络安全任务如何结合机器学习? 1
- Codeforces Round #112 (Div. 2)---A. Supercentral Point
- maven+springboot整合mybatis(十二)
- string转换函数以及hnu暑期实训部分和A+B的例题
- Android常用权限permission列表摘录
- 分享100个PHP源码整站系统,总有一款适合你
- eclipse豆沙绿设置(一些其他的编辑器也变成豆沙绿)
- openstack neutron网络插件学习(二)【linux-bridge实现】
- android exoplayer 直播流,使用Exo-Media Player播放RTMP直播
- Hbase——常见错误
- 使用百度地图api 报错 A parser-blocking, cross site
- DOS下Debug工具使用
- 在PHP中通过POST方法实现文件上传功能
- swss-bd-interview
- 获得“网管师”资格证书,开启新的网管职业生涯
- 坪山体育中心体育馆全景不同高度展示
- 使用 RIBs 重构 Uber 司机端
- npm run serve 报错问题 (npm ERR! code ELIFECYCLE)
热门文章
- 【Windows11来了】立刻安装Windows11预览版抢先体验(虚拟机 | 含详细安装步骤)
- 【第50篇】迈向快速、灵活、稳健的微光图像增强
- mblock机器人指令_mBot机器人如何通过蓝牙实现与PC端mBlock的无线通信?
- workflow bulider 官网下载路径
- 论文发表在计算机系统应用,《计算机系统应用》计算机科技论文发表
- java初学者的建议
- 「娃娃分享」-个人总结的一个VMP脱壳步骤.
- Visual Studio工程没有生成lib文件,只生成了dll文件
- Bank相关11_8583报文手动组包——详细分析每个示范域
- VVC/H.266代码阅读(VTM8.0)(三. Slice到CTU的处理 )