逆波兰计算器的完整代码

前置知识:

 

 

将中缀表达式转为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.mzph.cn/news/237695.shtml

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

相关文章

R语言——基本操作(二)

目录 一、矩阵与数组 二、列表 三、数据框 四、因子 五、缺失数据 六、字符串 七、日期和时间 参考 一、矩阵与数组 matrix&#xff1a;创建矩阵&#xff0c;nrow 和 ncol 可以省略&#xff0c;但其值必须满足分配条件&#xff0c;否则会报错 只写一个值则自动分配&…

5. 创建型模式 - 单例模式

亦称&#xff1a; 单件模式、Singleton 意图 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一…

谷歌Gemini造假始末

&#x1f4a1;大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 在过去一年中&#xff0c;OpenAI ChatGPT引发了一股AI新浪潮&#xff0c;而谷歌则一直处于被压制的状态&#xff0c;迫切需要一款现象级的AI产品来…

计算机网络:应用层

0 本节主要内容 问题描述 解决思路 1 问题描述 不同的网络服务&#xff1a; DNS&#xff1a;用来把人们使用的机器名字&#xff08;域名&#xff09;转换为 IP 地址&#xff1b;DHCP&#xff1a;允许一台计算机加入网络和获取 IP 地址&#xff0c;而不用手工配置&#xff1…

MySQL中MVCC的流程

参考文章一 参考文章二 当谈到数据库的并发控制时&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一个重要的概念。MVCC 是一种用于实现数据库事务隔离性的技术&#xff0c;常见于像 PostgreSQL 和 Oracle 这样的数据库系统中。 MVCC 的核心思想是为每个数据行维护…

kali-钓鱼网站远程代码漏洞分析

文章目录 一、靶场搭建二、开始信息收集&#xff0c;寻找漏洞三、使用蚁剑连接后门程序四、使用webshell查看数据库信息五、进入网站后台 实验环境 Kali CentOs 一、靶场搭建 CentOsIP地址192.168.64.159 #关闭centos防火墙 [rootlocalhost ~]# systemctl disable --now fi…

JavaWeb笔记之WEB开发

一、引言 1.1 C/S和B/S C/S和B/S是软件发展过程中出现的两种软件架构方式。 1.2 C/S架构 &#xff08;Client/Server 客户端/服务器&#xff09;。 特点&#xff1a;必须在客户端安装特定软件。 优点&#xff1a;图形效果显示较好(如&#xff1a;3D游戏)。 缺点&#xff1…

【Java代码审计】RCE篇

【Java代码审计】RCE篇 1.Java中的RCE2.ProcessBuilder命令执行漏洞3.Runtime exec命令执行漏洞4.脚本引擎代码注入5.RCE的防御 1.Java中的RCE 在PHP开发语言中有system()、exec()、shell_exec()、eval()、passthru()等函数可以执行系统命令。在Java开发语言中可以执行系统命令…

C#使用HTTP方式对接WebService

C#使用HTTP方式对接WebService C#对接WebService的几种方式 1.直接引用服务 添加服务 添加成功后, 会显示服务详细 调用服务 使用HTTPPost调用WebService option.RequestDataStr GetHttpRequestXml(strXmlBody); // 创建一个 HttpClient 对象 using (HttpClient client …

《深入浅出SSD》:固态存储核心技术、原理与实战

目录 前言 内容简介 作者简介 名人推荐 本书目录 了解更多 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊《深入浅出SSD》这本书&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&…

助力智能车辆检测计数,基于官方YOLOv8全系列[n/s/m/l/x]开发构建道路交通场景下不同参数量级车流检测计数系统

在很多道路交通卡口都有对车流量的统计计算需要&#xff0c;有时候一些特殊时段、特殊节日等时间下对于车流的监测预警更为重要&#xff0c;恶劣特殊天气下的提早监测、预警、限流对于保证乘客、驾驶员的安全是非常重要的措施&#xff0c;本文的主要目的就是想要开发构建道路交…

2 Pandas之Series

Pandas数据结构简介 Pandas可以处理以下三种数据&#xff1a; SeriesDataFramePanel 这些数据建立在NumPy上&#xff0c;故可以快速运行。 纬度描述 更好的理解这些数据结构的方式是将高维数据看作是低维数据的容器。例如&#xff0c;DataFrame是Series的容器&#xff0c;P…

最新ChatGPT网站系统源码+AI绘画系统+支持GPT语音对话+详细图文搭建教程/支持GPT4.0/H5端系统/文档知识库

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

python编程(1)之通用引脚GPIO使用

在之前的章节中&#xff0c;小编带领大家学习了&#xff1a;如何构建esp32的python开发环境-CSDN博客 今天小编带领大家开始学习python编程的第一节&#xff0c;通用引脚。esp32c3核心板是一个高度集成&#xff0c;功能丰富的模块&#xff0c;来看下他的功能分布&#xff1a; 我…

GraphPad Prism 10 for Mac v10.0.0.3 安装教程

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

统信UOS|DNS server|04-添加主域名解析

原文链接&#xff1a;统信UOS&#xff5c;DNS server&#xff5c;04-添加主域名解析 hello&#xff0c;大家好啊&#xff01;继我们在之前的文章中成功部署了测试用的HTTP服务器、搭建了DNS解析服务器&#xff0c;并添加了子域名解析之后&#xff0c;今天我们将继续我们的DNS域…

VSCode安装PYQT5

安装PYQT5 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install PyQt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple 获得Python环境位置 查看函数库安装位置 pip show 函数库名 通过查询函数库&#xff0c;了解到python安装位置为 C:\User…

力扣题:子序列-12.29

力扣题-12.29 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;522. 最长特殊序列 II 解题思想&#xff1a;首先将字符串列表按长度进行降序&#xff0c;然后对每个字符串进行判断是否是独有的子序列&#xff0c;因为短的字串可能是长的字串的子序…

解决vue2项目 el-dialog弹窗不显示

初始写法 使用了v-model 弹窗不显示 <el-dialog v-model"dialogVisible" title"Popup Content" :width"dialogWidth" close"handleCloseDialog"><p>{{ selectedItemContent }}</p></el-dialog> 将v-model改…

2023.12.19 关于 Redis 通用全局命令

目录 引言 Redis 全局命令 SET & GET KEYS EXISTS DEL EXPIRE TTL TYPE redis 引入定时器高效处理过期 key 基于优先级队列方式 基于时间轮方式 引言 Redis 是根据键值对的方式存储数据的必须要进入 redis-cli 客户端程序 才能输入 redis 命令 Redis 全局命令 R…