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用逆波兰表达式实现字符串计算器相关推荐

  1. java 实现逆波兰表达式_逆波兰表达式java实现

    知道逆波兰表达式是一个偶然的情况,在用js的时候偶然发现了js中的一个eval函数,数学的表达式它竟然能直接解析出结果.后面通过查询才得知里面的核心是用的逆波兰表达式的算法.后面网上找了一下java的 ...

  2. Java 逆波兰表达式完成计算器

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 三大表达式 一.中缀转后缀 二.逆波兰表达式计算 总结 三大表达式 前缀表达式 中缀表达式 :就是我们平时常见的表达式 对人来说 ...

  3. 数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

    栈的三种表达式:前缀.中缀和后缀表达式,后缀也叫逆波兰表达式 前缀(波兰表达式) 中缀(对人来讲很好理解,对于计算机来讲就方便了,一般会把中缀表达式转换成后缀表达式) 后缀(逆波兰表达式) 计算过程 ...

  4. 【Java版oj】逆波兰表达式求值

    目录 一.原题再现 二.问题分析 三.完整代码 一.原题再现 150. 逆波兰表达式求值 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除 ...

  5. 牛客 五子棋 逆波兰表达式计算器

    五子棋题目 牛客上一个比较有意思的思路,只需要判断四个方向 代码 import java.util.*; public class Main{public static boolean is(char ...

  6. java 逆波兰_逆波兰表达式算法-Java版

    这两天一直在看数据结构,栈这个地方,基础的就是这个逆波兰表达式,看了很多博文,都讲得不清不楚或者只能计算一个位的数字,决定自己写,这篇博文给了很大启发–>Go New Land AND Here ...

  7. java实现逆波兰算法,基于逆波兰算法实现计算器(Java控制台版)

    前言 计算器是日常生活中很常见的工具之一,但并不意味着计算器的软件实现原理就很简单.不少初学的小伙伴在尝试开发计算器的功能时,受到算术表达式中运算符优先级和多层嵌套等问题的困扰.本文采用逆波兰算法来实 ...

  8. 简单计算器 逆波兰表达式

    问题 C: 悠派计算器 时间限制: 1 Sec  内存限制: 128 MB 提交: 7  解决: 2 [提交][状态][讨论版][命题人:qianyouyou] 题目描述 yoyo的小老弟小渣渣灰特别 ...

  9. 逆波兰计算器android源码简书,计算器的核心算法-JavaScript实现(逆波兰表达式)...

    最终计算器的掩饰效果,欢迎大家来找BUG. http://codepen.io/lvanboy/full/LxKVxJ/ 功能: 1.按照运算符的优先级运算 2.利用上次的结果继续运算 3.多个数字混 ...

最新文章

  1. 049、准备overlay网络实验环境(2019-03-14 周四)
  2. 使用Java查询DynamoDB项
  3. 【渝粤题库】国家开放大学2021春2476旅游学概论题目
  4. LeetCode 250. 统计同值子树(递归)
  5. DriverMessageBean配置详解
  6. phpstudy 线上添加域名
  7. Python decorator
  8. 使用Microsoft Lookback网卡解决了断网情况下 Virtual Server 虚机和主机的网络连接
  9. POJ 2635 The Embarrassed Cryptographer(JAVA)
  10. 301 重定向 怎么让输入的不带www自动加上www
  11. 用c#中的WebBrowser抢小米F码,抢小米手机以及自动测试实现原理
  12. win10任务栏不合并图标如何设置
  13. 一些常用的资料_硬件/系统/等
  14. java 解析 ts_解析TS - xxdd的个人空间 - OSCHINA - 中文开源技术交流社区
  15. 使用Electron和Microsoft Bot Framework制作Skype Bot
  16. python绘制基因结构图_使用biopython可视化染色体和基因元件
  17. Tetgen软件学习和使用
  18. 创业需要宽广的心胸吗--leo看赢在中国第三季 6
  19. 明日直播:如何在RT-Thread上使用TFLite Micro实现AI相机?
  20. python电影爬虫背景介绍_python爬虫-爬虫电影八佰词云

热门文章

  1. 中望3D二次开发 控制台命令转PDF
  2. 怎么给黑白照片上色?这几个软件可以给黑白照片上色
  3. 腾讯云centOS7手动搭建LAMP并上传TP5项目
  4. Java中的数据存储方法——Map:key-value
  5. matlab带未知数的劳斯判据,自动控制原理实验用Matlab软件编制劳斯判据程序并解题(《学习辅导》例435).doc...
  6. 精美思维导图、流程图模板分享,疯狂提高你的工作效率
  7. 高德地图自适应显示多个标记点的应用
  8. QT 通过label控件显示图片,图片能自适应label的大小
  9. 探海利器公开课 前三讲笔记
  10. 【达内课程】H5前端开发