力扣772 基本计算器 III
772. 基本计算器 III
实现一个基本的计算器来计算简单的表达式字符串。
表达式字符串只包含非负整数,算符 +、-、*、/ ,左括号 ( 和右括号 ) 。整数除法需要 向下截断 。
你可以假定给定的表达式总是有效的。所有的中间结果的范围为 [-2^31, 2^31 - 1] 。
示例 1:
输入:s = "1+1"
输出:2
示例 2:输入:s = "6-4/2"
输出:4
示例 3:输入:s = "2*(5+5*2)/3+(6/2+8)"
输出:21
示例 4:输入:s = "(2+6*3+5-(3*14/7+2)*5)+3"
输出:-12
示例 5:输入:s = "0"
输出:0提示:
1 <= s <= 10^4
s 由整数、'+'、'-'、'*'、'/'、'(' 和 ')' 组成
s 是一个 有效的 表达式来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/basic-calculator-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
做题结果
成功,比较难的模拟题,有点耐心就可以写
方法:栈非递归写法
老师教的:先乘除,后加减,有括号的先算括号里的,说明了这三者的优先级
- 先处理括号
- 再处理乘除
- 最后处理加减
具体写法
- 数字记录左边界,从0开始,遇到符号,从符号下一个开始
- 遇到符号,检查前面数字左边界是否有空隙,有空隙追加数字
- 遇到右括号进行拆括号操作
- 找到当前位置到上一个左括号的范围
- 计算这一段里面的乘除法
- 非乘除号直接扔进一个新的栈,先不处理
- 遇到乘除取出左右数字,算完之后塞回去
- 还原原始栈内容
- 计算这一段里面的加减法
- 默认前一个数字0
- 遇到符号进行计算,取出下一个数字
- 计算结果累计回数字
- 最后计算的数值放回原始栈
- 其他符号,数字,直接扔栈里,先不处理
- 考虑到不想写额外处理,前面补一个左括号,最终当做遇到右括号进行拆括号处理一次
- 拿出栈顶
class Solution {public int calculate(String s) {Stack<String> stack = new Stack<>();//补一个左括号,最后当做有括号处理stack.push("(");int n = s.length();int j = 0;for(int i = 0; i < n; i++){char c = s.charAt(i);if(Character.isDigit(c)) continue;if(i>j)stack.push(s.substring(j,i));j = i+1;if(c == ')'){//先拆掉所有括号calculateNoBacket(stack);}else{stack.push(String.valueOf(c));}}//最后非括号情况会有数字,补一个数if(j<n) stack.push(s.substring(j,n));//计算整个无括号表达式calculateNoBacket(stack);return Integer.parseInt(stack.peek());}/*** 拆括号,拆出当前位置到上一个左括号的表达式*/private void calculateNoBacket(Stack<String> stack){Stack<String> tmp = new Stack<>();boolean hasMulDiv = false;while (!"(".equals(stack.peek())){if(stack.peek().equals("*") || "/".equals(stack.peek()))hasMulDiv = true;tmp.push(stack.pop());}stack.pop();if(hasMulDiv) calculateMulDiv(tmp);int num = calculateAddSub(tmp);stack.push(String.valueOf(num));}/*** 算加减,负数也不用特别处理(因为必然拿到前面是0)*/private int calculateAddSub(Stack<String> stack){int num = 0;while (!stack.isEmpty()){String str = stack.pop();if(!"+".equals(str) && !"-".equals(str)){num = Integer.parseInt(str);continue;}int num2 = Integer.parseInt(stack.pop());if("+".equals(str)){num = num+num2;}else{num = num-num2;}}return num;}/*** 算乘除,非乘除号的都不管(注意,不用处理负数,最后加减会处理,(-5)*3=-(5*3),不影响结果)* 乘除号的算出结果放左侧栈* 最后需放回到原始栈*/private void calculateMulDiv(Stack<String> stack){Stack<String> tmp = new Stack<>();while (!stack.isEmpty()){String str = stack.pop();if (!"*".equals(str) && !"/".equals(str)){tmp.push(str);continue;}int numA = Integer.parseInt(tmp.pop());int numB = Integer.parseInt(stack.pop());if("*".equals(str)){tmp.push(String.valueOf(numA*numB));}else{tmp.push(String.valueOf(numA/numB));}}while (!tmp.isEmpty()){stack.push(tmp.pop());}}}
其实是自己转载自己(给个力扣上的自己这篇题解链接,方便大家看)
力扣772 基本计算器 III相关推荐
- 力扣772 基本计算器III
通过不懈的努力终于写好了Golang的语言的代码~ 其实本来还是可以写的很简单的,但是为了加强栈在go语言中的操作,还是用stack进行了编写 题目如下: 实现一个基本的计算器来计算简单的表达式字符串 ...
- 力扣—— 224. 基本计算器(困难)
目录 题目描述 题目分析 c++代码 题目描述 给你一个字符串表达式s,请你实现一个基本的计算器来返回它的值.注意不允许使用任何将字符串作为数学表达式计算的内置函数,比如:eval(). 示例一: 输 ...
- 力扣学习记录(每日更新)
文章目录 引言 简单 力扣:1 两数之和 力扣:20 有效的括号 力扣:21 合并两个有序链表 力扣:22 括号生成 力扣:27 移除元素 力扣: 35 搜索插入位置 力扣:70 [爬楼梯](http ...
- 力扣 -- 123. 买卖股票的最佳时机 III
题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class So ...
- python【力扣LeetCode算法题库】220-存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...
- 力扣解法汇总732-我的日程安排表 III
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
- ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️
此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...
- LeetCode 力扣算法题解汇总,All in One
作者: 负雪明烛 id: fuxuemingzhu 个人博客: https://fuxuemingzhu.cn 关键词:LeetCode,力扣,算法,题解,汇总,解析 把自己刷过的所有题目做一个整理, ...
- 力扣(LeetCode)刷题,简单+中等题(第33期)
目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...
最新文章
- hdu1285 拓扑排序+优先队列
- Centos最小化装机网络问题
- HDU多校4 - 6808 Go Running(最小点覆盖+网络流优化)
- 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
- LeetCode MySQL 185. 部门工资前三高的所有员工(dense_rank)
- falcon适配ldap密码同步
- [转]Windows 7 蓝屏后获取 MEMORY.DMP 文件及注意事项
- 【报告分享】2020中国短视频行业洞察报告.pdf(附下载链接)
- wireshark的拆包与合并
- vlan未能连接服务器,PC单机局域网连接VLAN的方法
- 将mysql服务从C盘(原),安装到新路径D盘下(其中的数据一并迁移)
- php表格好看样式,用html和css代码实现各种表格样式的总结
- 华硕笔记本电脑突然失去WIFI功能
- 广告终结者chinalist-easylist语法规则
- CAD软件绘图如何提高效率 (下)
- 单片机c语言按键防抖程序,单片机按键防抖子程序详情解说 - 全文
- Axure学习笔记整理5-灯箱效果
- 解决Connection error: (‘Unable to connect to any servers‘, {‘192.168.193.136‘: OperationTimedOut。。。。
- uniapp-mixpanel用户行为分析埋点统计插件
- CTA-敏感行为-修改联系人(新建/更新/删除)