java用逆波兰表达式实现字符串计算器
1、java版本
import java.math.BigDecimal;
import java.util.*;/*** @return* @author Tmz* @description:* 后缀表达式(逆波兰)规则:* ①当前符号大于等于优先级大于等于栈顶优先级时弹出符号,并入栈当前符号 ,出栈的符号加入表达式末尾* ②“(” 符号优先级最低* ③ ")" 符号入栈是,符号出栈直到当前为 "(" ,并且该符号也要出栈,出栈的符号加入表达式末尾* 计算规则:* 遇到数字直接入栈,遇到操作符,则弹出两个项进行运算,将运算结果再入栈,最后栈底元素值则为最终结果* @date 2022/6/7 10:11*/public class HelloWorld {public static String[] operator = {"+", "-", "*", "/","%","^","(", ")"};public static void main(String[] args) {String expression = "-100**2";expression=expression.replaceAll("\\s+", ""); //去掉空格expression=expression.replace("**", "^"); //支持立方**这种写法expression=expression.replace("(-", "(0-"); //解决负数System.out.println(expression);
// System.out.println(getExpressionStack(expression));polishNotation(expression);}public static void polishNotation(String expression) {List<String> expressionList = getExpressionStack(expression); //中值表达式栈List<String> expressionList2 = new ArrayList<>();if ("-".equals(expressionList.get(0))) { //处理开头是负数的情况,直接加上括号expressionList2.add("(");expressionList2.add("0");expressionList2.add(expressionList.get(0));expressionList2.add(expressionList.get(1));expressionList2.add(")");expressionList2.addAll(expressionList.subList(2,expressionList.size()));}Stack<String> operatorStack = new Stack<>(); //操作符栈ArrayList<String> fixStack = new ArrayList<>(); //完整的逆波兰表达式Map<String, Integer> operatorLevelMap = new HashMap<>();operatorLevelMap.put("(", 0);operatorLevelMap.put("+", 1);operatorLevelMap.put("-", 1);operatorLevelMap.put("*", 2);operatorLevelMap.put("/", 2);operatorLevelMap.put("%", 2);operatorLevelMap.put("^", 3);operatorLevelMap.put(")", 4);System.out.println(expressionList2);String[] operator2 = {"+", "-", "*", "/","%","^"};for (String currentElmt : expressionList2) {if (Arrays.asList(operator2).contains(currentElmt)) {while (!operatorStack.empty() && operatorLevelMap.get(operatorStack.peek()) >= operatorLevelMap.get(currentElmt)) {fixStack.add(operatorStack.pop());}operatorStack.push(currentElmt);}else if("(".equals(currentElmt)){operatorStack.push(currentElmt);} else if(")".equals(currentElmt)){while (!operatorStack.empty() && operatorLevelMap.get(operatorStack.peek()) >= operatorLevelMap.get("(")+1) {fixStack.add(operatorStack.pop());}if (!operatorStack.empty()) {operatorStack.pop();}}else{fixStack.add(currentElmt);}}while (!operatorStack.isEmpty()) {fixStack.add(operatorStack.pop());}System.out.println(fixStack);//计算结果Stack<String> calculateStack = new Stack<>();for (String fix : fixStack) {//操作符号,弹出两个数字计算,并压入结果栈中if (Arrays.asList(operator2).contains(fix)) {String number2 = calculateStack.pop();String number1 = calculateStack.pop();switch (fix) {case "+":calculateStack.push(new BigDecimal(number1).add(new BigDecimal(number2)).toString());break;case "-":calculateStack.push(new BigDecimal(number1).subtract(new BigDecimal(number2)).toString());break;case "*":calculateStack.push(new BigDecimal(number1).multiply(new BigDecimal(number2)).toString());break;case "/":calculateStack.push(String.valueOf(Double.valueOf(number1)/Double.valueOf(number2)));break;case "%":calculateStack.push(String.valueOf(Double.valueOf(number1)%Double.valueOf(number2)));break;case "^":calculateStack.push(String.valueOf(Math.pow(Double.valueOf(number1), Double.valueOf(number2))));break;}}else{//数字入栈calculateStack.push(fix);}}System.out.println(calculateStack.pop());}//把表达式转换为 栈public static List<String> getExpressionStack(String expression) {List<String> retList = new ArrayList<>();String fix = "";for (int i = 0; i < expression.length(); i++) {String tempStr = String.valueOf(expression.charAt(i));if (Arrays.asList(operator).contains(tempStr)) {if (!"".equals(fix)) {retList.add(fix);}retList.add(tempStr);fix = "";}else{fix = fix + tempStr;}}if(!"".equals(fix))retList.add(fix);return retList;}}
2、ahk版本
str:="-2**10"
;msgBox % 1 "+" 2
;msgBox % mod(3,2)
polish_notation(str)
return;逆波兰表达式https://blog.csdn.net/assiduous_me/article/details/101981332:
polish_notation(expression)
{operatorlevel_map:={"(":0,"+":"1","-":1,"*":2,"/":"2","%":2,"^":3,")":4}operator_list:={"+":0,"-":0,"*":0,"/":0,"%":0,"^":0};去除不必要的空格expression:=trim(expression)expression:=RegExReplace(expression,"\s+","");替换立方根StringReplace expression,expression,**,^,all;替换负数StringReplace expression,expression,`(-,`(0-,allmsgBox % expression;msgBox % expression;①.获取一个中缀表达式集合类似 100+2 -> ["100","+","2"]middlefix_list:=[]fix:=""loop ,parse,expression{current_value:=A_LoopFieldif(operatorlevel_map.haskey(current_value)){if(""!=fix)middlefix_list.push(fix)middlefix_list.push(current_value)fix:=""}else fix:=fix current_value}if(fix!="")middlefix_list.push(fix)if(middlefix_list[1]="-") ;处理开头为负数{middlefix_list.insertAt(1,"(")middlefix_list.insertAt(2,"0")middlefix_list.insertAt(5,")")};②.转换为后缀表达式(逆波兰表达式)operator_stack:=[]suffix_list:=[]for index ,currentElmt in middlefix_list{if(operator_list.haskey(currentElmt)){while(operator_stack.length()>0 && operatorlevel_map[operator_stack[operator_stack.Length()]]>=operatorlevel_map[currentElmt])suffix_list.push(operator_stack.pop())operator_stack.push(currentElmt)}else if(currentElmt="(")operator_stack.push("(")else if(currentElmt=")"){while(operator_stack.length()>0 && operatorlevel_map[operator_stack[operator_stack.length()]]>operatorlevel_map["("])suffix_list.push(operator_stack.pop())if(operator_stack.length()>0)operator_stack.pop()}elsesuffix_list.push(currentElmt)}while(operator_stack.length()>0)suffix_list.push(operator_stack.pop());③.计算表达式最终的值,规则数字入栈,操作符就出栈两个元素计算值并把结果入栈number_stack:=[]for key,opertor_or_number in suffix_list{if(operator_list.haskey(opertor_or_number)){number2:=number_stack.pop()number1:=number_stack.pop()if(opertor_or_number="+")number_stack.push(number1+number2)if(opertor_or_number="-")number_stack.push(number1-number2)if(opertor_or_number="*")number_stack.push(number1*number2)if(opertor_or_number="/")number_stack.push(number1/number2)if(opertor_or_number="%")number_stack.push(mod(number1,number2))if(opertor_or_number="^")number_stack.push(number1**number2)}elsenumber_stack.push(opertor_or_number)}result:=number_stack.pop()msgBox % result}
java用逆波兰表达式实现字符串计算器相关推荐
- java 实现逆波兰表达式_逆波兰表达式java实现
知道逆波兰表达式是一个偶然的情况,在用js的时候偶然发现了js中的一个eval函数,数学的表达式它竟然能直接解析出结果.后面通过查询才得知里面的核心是用的逆波兰表达式的算法.后面网上找了一下java的 ...
- Java 逆波兰表达式完成计算器
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 三大表达式 一.中缀转后缀 二.逆波兰表达式计算 总结 三大表达式 前缀表达式 中缀表达式 :就是我们平时常见的表达式 对人来说 ...
- 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)
栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...
- 【Java版oj】逆波兰表达式求值
目录 一.原题再现 二.问题分析 三.完整代码 一.原题再现 150. 逆波兰表达式求值 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除 ...
- 牛客 五子棋 逆波兰表达式计算器
五子棋题目 牛客上一个比较有意思的思路,只需要判断四个方向 代码 import java.util.*; public class Main{public static boolean is(char ...
- java 逆波兰_逆波兰表达式算法-Java版
这两天一直在看数据结构,栈这个地方,基础的就是这个逆波兰表达式,看了很多博文,都讲得不清不楚或者只能计算一个位的数字,决定自己写,这篇博文给了很大启发–>Go New Land AND Here ...
- java实现逆波兰算法,基于逆波兰算法实现计算器(Java控制台版)
前言 计算器是日常生活中很常见的工具之一,但并不意味着计算器的软件实现原理就很简单.不少初学的小伙伴在尝试开发计算器的功能时,受到算术表达式中运算符优先级和多层嵌套等问题的困扰.本文采用逆波兰算法来实 ...
- 简单计算器 逆波兰表达式
问题 C: 悠派计算器 时间限制: 1 Sec 内存限制: 128 MB 提交: 7 解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...
- 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...
最终计算器的掩饰效果,欢迎大家来找BUG. http://codepen.io/lvanboy/full/LxKVxJ/ 功能: 1.按照运算符的优先级运算 2.利用上次的结果继续运算 3.多个数字混 ...
最新文章
- 049、准备overlay网络实验环境(2019-03-14 周四)
- 使用Java查询DynamoDB项
- 【渝粤题库】国家开放大学2021春2476旅游学概论题目
- LeetCode 250. 统计同值子树(递归)
- DriverMessageBean配置详解
- phpstudy 线上添加域名
- Python decorator
- 使用Microsoft Lookback网卡解决了断网情况下 Virtual Server 虚机和主机的网络连接
- POJ 2635 The Embarrassed Cryptographer(JAVA)
- 301 重定向 怎么让输入的不带www自动加上www
- 用c#中的WebBrowser抢小米F码,抢小米手机以及自动测试实现原理
- win10任务栏不合并图标如何设置
- 一些常用的资料_硬件/系统/等
- java 解析 ts_解析TS - xxdd的个人空间 - OSCHINA - 中文开源技术交流社区
- 使用Electron和Microsoft Bot Framework制作Skype Bot
- python绘制基因结构图_使用biopython可视化染色体和基因元件
- Tetgen软件学习和使用
- 创业需要宽广的心胸吗--leo看赢在中国第三季 6
- 明日直播:如何在RT-Thread上使用TFLite Micro实现AI相机?
- python电影爬虫背景介绍_python爬虫-爬虫电影八佰词云
热门文章
- 中望3D二次开发 控制台命令转PDF
- 怎么给黑白照片上色?这几个软件可以给黑白照片上色
- 腾讯云centOS7手动搭建LAMP并上传TP5项目
- Java中的数据存储方法——Map:key-value
- matlab带未知数的劳斯判据,自动控制原理实验用Matlab软件编制劳斯判据程序并解题(《学习辅导》例435).doc...
- 精美思维导图、流程图模板分享,疯狂提高你的工作效率
- 高德地图自适应显示多个标记点的应用
- QT 通过label控件显示图片,图片能自适应label的大小
- 探海利器公开课 前三讲笔记
- 【达内课程】H5前端开发