逆波兰计算器的完整代码

前置知识:

 

 

将中缀表达式转为List方法:

 //将一个中缀表达式转成中缀表达式的List//即:(30+42)*5-6 ==》[(, 30, +, 42, ), *, 5, -, 6]public static List<String> toIndixExpressionList(String s) {//定义一个List,存放中缀表达式对应的内容List<String> ls = new ArrayList<String>();int i = 0; //这是一个指针,用于遍历 中缀表达式字符串String str = ""; //对多位数的拼接char c; //每遍历到一个字符,我需要加入到lsdo {//如果是一个字符,直接添加到listif ((c = s.charAt(i)) < '0' || (c = s.charAt(i)) > '9') {ls.add("" + c);i++; //指针后移} else { //如果是一个数,需要考虑多位数str = ""; //将字符串置空while ((i < s.length()) && (c = s.charAt(i)) >= '0' && (c = s.charAt(i)) <= '9') {str += c;i++;}ls.add(str);}} while (i < s.length());return ls;}

将中缀表达式转化为后缀表达式(删除小括号):
 

 //将得到的中缀表达式对应的 List => 后缀表达式对应的 List// [(, 30, +, 42, ), *, 5, -, 6] ==》 30,42,+,5,*,6,-public static List<String> parseSuffixExpressionList(List<String> ls){//定义两个栈Stack<String> operStack = new Stack<String>();   //符号栈//因为 resStack ,这个栈整个转换过程中,没有pop操作,而且后面我们还需要逆序输出//因此我们这里使用 List<String> resList作为结果的存储List<String> resList = new ArrayList<String>();//遍历lsfor (String item :ls) {//如果是一个数就直接加入到resListif(item.matches("\\d+")){resList.add(item);}else if (item.equals("(")){operStack.push(item);}else if(item.equals(")")){//如果是右括号,则依次弹出 operStack 栈顶的运算符,并压入s2,// 直到遇到左括号为止,此时将这一对括号丢弃while (!operStack.peek().equals("(")) {String temp = operStack.pop();resList.add(temp);}operStack.pop(); //将 ( 弹出符号栈,消除小括号}else {//当item的优先级 <= operStack 栈顶运算符,// 将 operStack 栈顶的运算符弹出并加入到 resList中// 再次与新 operStack 中新的栈运算符相比较while (operStack.size() != 0 && Operation.getValue(operStack.peek()) >= Operation.getValue(item)){resList.add(operStack.pop());}//还需要将item压入栈中operStack.push(item);}}//将operStack中剩余的运算符依次弹出并加入到resList中while (operStack.size()!=0){resList.add(operStack.pop());}return resList; //注意因为是存放到List,因此按顺序输出就是对应的后缀表达式}

运算符的优先级:

//编写一个类 Operation 可以返回一个运算符 ,对应的优先级
class Operation{private static int ADD = 1;private static int SUB = 1;private static int MUL = 2;private static int DIV = 2;//写一个方法,返回对应的优先级数字public static int getValue(String operation){int result = 0;switch (operation){case "+":result = ADD;break;case "-":result = SUB;break;case "*":result = MUL;break;case "/":result = DIV;break;default:System.out.println("不存在该运算符~");break;}return result;}
}

 运算方法:

    public static int cal(List<String> list) {//创建一个栈Stack<String> stack = new Stack<String>();int res = 0;//遍历 listfor (String s : list) {//这里使用正则表达式取出来数if (s.matches("\\d+")) {//如果是多个数字,直接入栈stack.push(s);} else {//如果取出的不是数字,需要弹出两个数字,进行运算,将运算结果,继续入栈操作int num2 = Integer.parseInt(stack.pop());int num1 = Integer.parseInt(stack.pop());if (s.equals("+")) {res = num1 + num2;} else if (s.equals("-")) {res = num1 - num2;} else if (s.equals("*")) {res = num1 * num2;} else if (s.equals("/")) {res = num1 / num2;} else {throw new RuntimeException("您输入的运算符有误!");}stack.push("" + res);}}return Integer.parseInt(stack.pop());}

测试类:

public static void main(String[] args) {//先定义逆波兰表达式//(3+4)*5-6 ==> 3 4 + 5 * 6 -//说明为了方便,逆波兰表达式的 数字和字符使用空格隔开String Expression = "(10+2)*5-6*2";/** 思路*  1. 先将 " 3 4 + 5 * 6 - " => 放到ArrayList中*  2. 将ArrayList 传递给一个方法,遍历ArrayList 配合栈 完成计算*///得到一个后缀表达式List<String> list = toIndixExpressionList(Expression);System.out.println("运算表达式为:" + list);//将中缀表达式转化为后缀表达式List<String> suffixExpression = parseSuffixExpressionList(list);System.out.println("后缀表达式为: "+suffixExpression);//现在进行运算System.out.println(list + " = " + cal(suffixExpression));}

 控制台输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/222644.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python]python实现对jenkins 的任务触发

目录 关键词平台说明背景一、安装 python-jenkins 库二、code三、运行 Python 脚本四、注意事项 关键词 python、excel、DBC、jenkins 平台说明 项目Valuepython版本3.6 背景 用python实现对jenkins 的任务触发。 一、安装 python-jenkins 库 pip install python-jenkin…

文件的使用(初阶)

前言&#xff1a; 我们先来看一个内存使用图&#xff1a; 这其中内核空间用户代码是不能读写的专门留给操作系统内核去使用。 但是这一篇我们来讲文件&#xff08;上方内存图意义不明&#xff0c;哈哈&#xff0c;权当复习&#xff09;。 文件是用来存放数据的&#xff0c;但是…

配置BGP的基本示例

BGP简介 定义 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1&#xff08;RFC1105&#xff0…

核货宝订单管理系统提高企业效率

核货宝订单管理系统可以帮助企业提高效率&#xff0c;具体体现在以下几个方面&#xff1a; 一、订单自动化处理&#xff1a;核货宝订单管理系统支持订单批发和多渠道订单导入&#xff0c;它可以从订单的接收、处理、跟进、发货、到售后服务等环节都可以通过系统自动完成&#x…

再看参数校验

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 写一个接口&#xff0c…

OpenFeign 万字教程详解

OpenFeign 万字教程详解 目录 一、概述 1.1.OpenFeign是什么&#xff1f;1.2.OpenFeign能干什么1.3.OpenFeign和Feign的区别1.4.FeignClient 二、OpenFeign使用 2.1.OpenFeign 常规远程调用2.2.OpenFeign 微服务使用步骤2.3.OpenFeign 超时控制2.4.OpenFeign 日志打印2.5.O…

数据可视化:赋能企业决策的视觉力量

数据可视化在企业中扮演着至关重要的角色&#xff0c;为决策者提供了直观、深入的数据解读&#xff0c;帮助他们更好地理解业务状况并作出明智的决策。今天我就以可视化从业者的角度来简谈说说如何让数据可视化为更好地为企业服务。 首先&#xff0c;数据可视化可以让数据更易…

HFish蜜罐搭建及简单使用

一、HFish蜜罐 HFish是一款社区型免费蜜罐&#xff0c;侧重企业安全场景&#xff0c;从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发&#xff0c;为用户提供可独立操作且实用的功能&#xff0c;通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的…

类和对象(下篇)

再谈构造函数 构造函数体赋值 在之前的学习中我们知道&#xff0c;在创建一个对象时&#xff0c;我们的编译器就会自动调用构造函数将对象初始化&#xff0c;给对象中各个成员变量一个合适的初始值。 例如&#xff1a; class Date { public:Date(int year, int month, int d…

【pentaho】kettle读取Hive表不支持bigint和timstamp类型解决。

一、bigint类型 报错: Unable to get value BigNumber(16) from database resultset显示kettle认为此应该是decimal类型(kettle中是TYPE_BIGNUMBER或称BigNumber)&#xff0c;但实际hive数据库中是big类型。 修改kettle源码解决&#xff1a; kettle中java.sql.Types到kettle…

创建Github Pages 仓库

Github Pages 仓库创建 1. 在 GitHub 上创建一个新仓库2. 在仓库中创建一个分支&#xff08;可选&#xff0c;可跳过&#xff09;3. 创建您的静态网站4. 启用 GitHub Pages5. 等待构建完成6. 访问您的网站 在 GitHub 上创建一个 GitHub Pages 仓库是相对简单的。GitHub Pages 允…

JMeter---JSON提取器

JMeter的JSON提取器是一个用于从JSON响应中提取数据的元件。它可以从JSON响应中提取特定字段的值&#xff0c;并将这些值用于后续的测试步骤。 使用JSON提取器的步骤如下&#xff1a; 添加一个HTTP请求&#xff0c;用于获取包含JSON响应的数据。 在HTTP请求之后添加一个JSON提…

数字图像处理-空间域图像增强-爆肝18小时用通俗语言进行超详细的总结

目录 灰度变换 直方图&#xff08;Histogram&#xff09; 直方图均衡 直方图匹配&#xff08;规定化&#xff09; 空间滤波 低通滤波器 高通滤波器 ​​​​​​​ 本文章讲解数字图像处理空间域图像增强&#xff0c;大部分内容来源于课堂笔记中 灰度变换 图像增强&…

万界星空开源MES/注塑MES/开源注塑MES/免费MES/MES源码

一、系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES、好看的数据大屏、功能齐全开源mes. 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&…

【大模型】LLM显存占用对比:Qwen-7B-Chat,Qwen-14B-Chat-Int8,chatglm3-6b

【大模型】LLM显存占用对比&#xff1a;Qwen-7B-Chat&#xff0c;Qwen-14B-Chat-Int8&#xff0c;chatglm3-6b 显存占用对比&#xff1a;总结参考 显存占用对比&#xff1a; 显卡&#xff1a;NVIDIA GeForce RTX 4090 系统环境&#xff1a;ubuntu 22.04LTS Qwen-14B-Chat-Int8…

VScode 工作区配置 和 用户配置

一、工作区配置 通常不同的项目都有不同的配置&#xff0c;我一般都是使用eslint和prettier一起用&#xff0c;所以经常会有这几个文件&#xff1a; 这里简单介绍一下这几个文件的作用吧。 1.vscode文件夹下 一般有两个文件&#xff0c;extensions.json和settings.json。 e…

[Linux] LVS+Keepalived高可用集群部署

一、Keepalived实现原理 1.1 高可用方案 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 在一个LVS服务集群中通常有主服务器&#xff08;MASTER&#xff09;和备份服务器&#xff08;BACKUP&#xff09;两种角色…

WEB 3D技术 three.js 设置图像随窗口大小变化而变化

本文 我们来讲讲我们图层适应窗口变化的效果 可能这样说有点笼统 那么 自适应应该大家更熟悉 就是 当我们窗口发生变化说 做一些界面调整比例 例如 我们这样一个i项目界面 我们打开 F12 明显有一部分被挡住了 那么 我们可以刷新 这样是正常了 但是 我们将F12关掉 给F12的…

FFmpeg 简单文档

一、播放器框架 常用音视频术语 容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如mp4、flv、mkv等。媒体流&#xff08;Stream&#xff09;&#xff1a;表示时间轴上的一段连续数据&#xff0c;如一段声音数据、…

解决找不到vcruntime140.dll无法继续执行的多种方法分享

最近&#xff0c;我在使用电脑时遇到了一个问题&#xff0c;即“由于找不到vcruntime140.dll无法继续执行”。vcruntime140.dll是Visual C Redistributable Packages中的一个组件&#xff0c;它是Visual Studio 2015中运行C程序所必需的。如果找不到vcruntime140.dll文件&#…