Leetcode224 -- 基本计算器及其拓展

题目分析:

其实这个计算器的实现并不难,因为除了括号就剩下加减法嘛,括号肯定比加减法先执行,但是加减法是同级的,只是会改变数字的正负号而已,所以实现的逻辑并不是很难,我们只需要一个栈,来保存当前的符号sign即可.
遇到 '(' 就将当前符号入栈
遇到 ')' 就将当前符号弹出
遇到 '+' 就获取栈顶的符号(注意不是弹出),因为+不改变方向,所以从栈中取出来什么就是什么

遇到 '-'  也获取栈顶的符号(注意不是弹出),但是 - 会改变方向,所以给取出来的符号取反即可
遇到数字 就一直向下计算,直到下一个符号不是数字
最后把每个阶段算出来的结果相加就是答案


代码实现:

class Solution {public int calculate(String s) {Deque<Integer> stack = new ArrayDeque<>();stack.push(1);//这个栈中保存的是  符号int sign = 1; // 整数  -1   +1 代表当前的符号int res = 0,i = 0, n = s.length();while(i < n) {char c = s.charAt(i);switch(c) {case ' ':{i++;break;}case '+':{i++;sign = stack.peek();break;}case '-':{i++;sign = -stack.peek();break;}case '(':{i++;stack.push(sign);break;}case ')':{i++;stack.pop();break;}default:{long sum = 0;while(i < n && Character.isDigit(s.charAt(i))) {sum = sum * 10 + s.charAt(i) - '0';i++;}res += sum * sign;}}}return res;}
}

题目拓展:

这个拓展是来自于Ks的一道面试题,也没有明确说明,但默认能猜出来是考什么

区别及实现思路:

先说一下和Leetcode224的区别,就是多了*/这两个符号,并且*/个加减不属于一个级别,*/优先于+-,所以这里扯到了优先级的概念,并且还有(),为了保证括号内的表达式先被计算,我们定义( 的优先级是最低的,这样定义了优先级之后,就很清晰了
实现思路如下:
1.遇到数字直接加到操作数列表
2.遇到优先级,与最近加入的优先级做对比,
        2.1 如果大于最近的优先级,则将操作符直接加入到操作符列表,
        2.2 否则从操作列表里拿一个操作符和两个操作数进行计算,将计算的结果加到原来的列表  

        重复上面的操作直到找到一个比当前操作符优先级更低的操作符(在列表中)或者列表为空,再将当前的操作符加入到列表。

        由于括号的优先级最高,我们要让括号里面的操作符最先被计算,所以可以将'('的优先级设为最低
 

代码实现:

 public double calculateKs(String expression) {Deque<Double> numbers = new LinkedList<>();Deque<Character> operators = new LinkedList<>();int index = 0,len = expression.length();while(index < len) {char c = expression.charAt(index);if(c == '(') {operators.push(c);index++;}else if(c == ')') {//计算括号内的表达式while(operators.peek() != '(') {//单点操作,不是连点操作,所以得循环一直算,直到不符合条件为止compute(numbers,operators);}operators.pop();index++;}else if(isOperator(c)) {//处理操作符,考虑优先级while(!operators.isEmpty() && precedence(operators.peek())  >= precedence(c)) {//单点操作,不是连点操作,所以得循环一直算,直到不符合条件为止compute(numbers,operators);}operators.push(c);index++;}else if(Character.isDigit(c)) {//解析数字 -- 因为可能不只是一位数,所以要进行拼接StringBuilder sb = new StringBuilder();while(index < len && Character.isDigit(expression.charAt(index))) {sb.append(expression.charAt(index++));}numbers.push(Double.parseDouble(sb.toString()));}}//计算剩余的操作while(!operators.isEmpty()) {//单点操作,不是连点操作,所以得循环一直算compute(numbers,operators);}return numbers.pop();}public boolean isOperator(char c) {return c =='+' || c == '-' || c == '*' || c == '/';}//定义操作符的优先级public int precedence(char c) {if(c == '+' || c == '-') {return 1;}else if(c == '*' || c == '/') {return 2;}return 0;}//单点操作,不是连点操作,所以就算一次public void compute(Deque<Double> numbers,Deque<Character> operators) {if(numbers.size() < 2) {return;}double b = numbers.pop();double a = numbers.pop();char operator = operators.pop();double res = 0.0;switch(operator) {case '+':{res = a + b;break;}case '-':{res = a - b;break;}case '*':{res = a * b;break;}case '/':{res = a / b;break;}default:break;}numbers. Push(res);}

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

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

相关文章

【jvm】为什么Xms和Xmx的值通常设置为相同的?

目录 1. 说明2. 避免性能开销3. 提升稳定性4. 简化配置5. 优化垃圾收集6. 获取参数6.1 代码示例6.2 结果示例 1. 说明 1.-Xms 和 -Xmx 参数分别用于设置堆内存的初始大小&#xff08;最小值&#xff09;和最大大小。2.在开发环境中&#xff0c;开发人员可能希望快速启动应用程…

瑞芯微RK3566/RK3568 Android11下该如何默认屏蔽导航栏/状态栏?看这篇文章就懂了

本文介绍瑞芯微RK3566/RK3568在Android11系统下&#xff0c;默认屏蔽导航栏/状态栏方法&#xff0c;使用触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566芯片&#xff0c;类树莓派设计&#xff0c;Laval官方社区主荐&#xff0c;已适配全新OpenHarmony5.0 R…

使用AIM对SAP PO核心指标的自动化巡检监控

一、背景 由于SAP PO系统维护成本较高&#xff0c;各类型异常报错等都需要人员进行时刻监控和响应&#xff0c;遂由AIM平台进行自动化巡检SAP PO的各指标&#xff0c;然后告警通知用户&#xff0c;节省维护成本和提高工作效率 二、核心指标监控 SAP PO失败消息 适用于S…

openpnp - 手工修改配置文件(元件高度,size,吸嘴)

文章目录 openpnp - 手工修改配置文件(元件高度,size,吸嘴)概述笔记parts.xmlpackages.xml 手工将已经存在的NT1,NT2拷贝出来改名备注END openpnp - 手工修改配置文件(元件高度,size,吸嘴) 概述 载入新板子贴片准备时&#xff0c;除了引入Named CSV文件&#xff0c;还要在ope…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

算法:排序

排序算法 1. 简单排序1.1 直接插入排序1.2 冒泡排序1.3 简单选择排序 2. 希尔排序3. 快速排序4. 堆排序5. 归并排序 将文件的内容按照某种规则进行排列。 排序算法的稳定判定&#xff1a;若在待排序的一个序列中&#xff0c; R i R_i Ri​和 R j R_j Rj​的关键码相同&#xf…

Topaz Photo AI for Mac人工智能图像降噪软件 安装教程【保姆级教程,简单操作轻松上手】

Mac分享吧 文章目录 Topaz Photo AI for Mac人工智能图像降噪软件 安装完成&#xff0c;软件打开效果一、Topaz Photo AI 人工智能图像降噪软件 Mac电脑版——v3.3.0⚠️注意事项&#xff1a;1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件&#xff0c;根据步骤完成操作…

k8s部署redis远程连接示例

一、环境 节点 IP 服务 master 192.168.126.46 docker、kubeadm、kubelet、kubectl、flannel、telnet node1 192.168.126.47 docker、kubeadm、kubelet、kubectl、flannel、telnet node2 192.168.126.48 docker、kubeadm、kubelet、kubectl、flannel、telnet ubunt…

ubuntu内核更新导致显卡驱动掉的解决办法

方法1&#xff0c;DKMS指定内核版本 用第一个就行 1&#xff0c;借鉴别人博客解决方法 2&#xff0c;借鉴别人博客解决方法 方法2&#xff0c;删除多于内核的方法 系统版本&#xff1a;ubuntu20.24 这个方法是下下策&#xff0c;如果重装驱动还是不行&#xff0c;就删内核在…

Apache Hive分布式容错数据仓库系统

Apache Hive™是一个分布式的、容错的数据仓库系统&#xff0c;它支持大规模的分析&#xff0c;并使用SQL方便地读取、写入和管理驻留在分布式存储中的pb级数据。 Apache Hive Apache Hive是什么 Apache Hive是一个分布式的、容错的数据仓库系统&#xff0c;支持大规模的分析…

运用AI视频拍摄技术生成3D场景:适用于建模、XR及文旅项目Demo制作

利用AI技术从拍摄的视频中生成3D场景&#xff0c;这种创新方法非常适合用于快速构建高质量的3D模型。生成的3D场景不仅能够用于建筑和设计行业的模型展示&#xff0c;还能应用于扩展现实&#xff08;XR&#xff09;技术的大空间体验开发。此外&#xff0c;在文化旅游领域&#…

论文提交步骤 | 2024年第五届MathorCup大数据竞赛

2024年第五届MathorCup数学应用挑战赛—大数据竞赛于2024年10月25日下午6点正式开赛。 论文和承诺书、支撑材料&#xff08;可选&#xff09;及计算结果文档由各参赛队队长电脑登录下方报名主页提交&#xff1a; https://www.saikr.com/vse/bigdata2024 初赛作品提交截止时间为…

11-Dockerfile

11-Dockerfile Dockerfile Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤&#xff1a; 编写Dockerfile文件docker build命令构建镜像docker run依据镜像运行容器实例 构建过程 Dockerfile编写&#xff1a…

如何合并几个pdf文件?值得推荐几个PDF文件的方法

如何合并几个pdf文件&#xff1f;这些PDF文件既是智慧的宝库&#xff0c;也是错综复杂的迷宫&#xff0c;它们如同夜空中散落的繁星&#xff0c;虽然各自闪耀&#xff0c;却因缺乏联系而难以汇聚成照亮前行之路的璀璨星河。当我们急需从这片信息的海洋中捕捞到关键的智慧珍珠时…

rabbitmq高级特性(2)TTL、死信/延迟队列、事务与消息分发

目录 1.TTL 1.1.设置消息过期时间 1.2.设置队列过期时间 2.死信队列 2.1.介绍 2.2.演示 3.延迟队列 3.1.模拟实现延迟队列 3.2.延迟队列插件 4.事务与消息分发 4.1.事务 4.2.消息分发 1.TTL 所谓的ttl&#xff0c;就是过期时间。对于rabbitmq&#xff0c;可以设置…

Java集合常见面试题总结(5)

HashSet 如何检查重复? 当你把对象加入HashSet时&#xff0c;HashSet 会先计算对象的hashcode值来判断对象加入的位置&#xff0c;同时也会与其他加入的对象的 hashcode 值作比较&#xff0c;如果没有相符的 hashcode&#xff0c;HashSet 会假设对象没有重复出现。但是如果发…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

测试管理|如何做好质量管理、提高研发的代码质量?

以下为作者观点&#xff1a; 起因是领导一直在提的一个观点&#xff1a;测试不能只测试系统&#xff0c;重点要放到质量管理上&#xff0c;要管理、监督研发的开发质量。 公司是乙方&#xff0c;接项目过日子&#xff0c;算是外包企业吧。项目时间一般都比较紧张&#xff08;…

QT项目-仿QQ聊天(带宠物系统)

目录 一&#xff0c;项目介绍 二&#xff0c;开发环境 三&#xff0c;涉及技术 四&#xff0c;项目效果示例图 1&#xff0c;登录界面 2&#xff0c;主界面 3&#xff0c;聊天界面 4&#xff0c;功能界面 5&#xff0c;宠物界面 一&#xff0c;项目介绍 这是一个基于u…

vue打包项目通过docker部署nginx服务

一、构建前端代码 npm install nmp run build 确认自己的打包路径&#xff0c;默认是dist&#xff0c;这里也可以修改。 二、将打包的项目使用dockerfile构建 dockerfile 将dist文件复制到nginx的指定的路径&#xff0c;前端界面的路径&#xff0c;还需要两个conf文件 FR…