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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

做题结果

成功,比较难的模拟题,有点耐心就可以写

方法:栈非递归写法

老师教的:先乘除,后加减,有括号的先算括号里的,说明了这三者的优先级

  1. 先处理括号
  2. 再处理乘除
  3. 最后处理加减

具体写法

  1. 数字记录左边界,从0开始,遇到符号,从符号下一个开始
  2. 遇到符号,检查前面数字左边界是否有空隙,有空隙追加数字
  3. 遇到右括号进行拆括号操作
    • 找到当前位置到上一个左括号的范围
    • 计算这一段里面的乘除法
      • 非乘除号直接扔进一个新的栈,先不处理
      • 遇到乘除取出左右数字,算完之后塞回去
      • 还原原始栈内容
    • 计算这一段里面的加减法
      • 默认前一个数字0
      • 遇到符号进行计算,取出下一个数字
      • 计算结果累计回数字
      • 最后计算的数值放回原始栈
  4. 其他符号,数字,直接扔栈里,先不处理
  5. 考虑到不想写额外处理,前面补一个左括号,最终当做遇到右括号进行拆括号处理一次
  6. 拿出栈顶
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相关推荐

  1. 力扣772 基本计算器III

    通过不懈的努力终于写好了Golang的语言的代码~ 其实本来还是可以写的很简单的,但是为了加强栈在go语言中的操作,还是用stack进行了编写 题目如下: 实现一个基本的计算器来计算简单的表达式字符串 ...

  2. 力扣—— 224. 基本计算器(困难)

    目录 题目描述 题目分析 c++代码 题目描述 给你一个字符串表达式s,请你实现一个基本的计算器来返回它的值.注意不允许使用任何将字符串作为数学表达式计算的内置函数,比如:eval(). 示例一: 输 ...

  3. 力扣学习记录(每日更新)

    文章目录 引言 简单 力扣:1 两数之和 力扣:20 有效的括号 力扣:21 合并两个有序链表 力扣:22 括号生成 力扣:27 移除元素 力扣: 35 搜索插入位置 力扣:70 [爬楼梯](http ...

  4. 力扣 -- 123. 买卖股票的最佳时机 III

    题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class So ...

  5. python【力扣LeetCode算法题库】220-存在重复元素 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...

  6. ​力扣解法汇总732-我的日程安排表 III

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  7. ❤️思维导图整理大厂面试高频数组19: 股票问题III的dp数组构建/初始化和空间优化难点, 力扣123❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  8. LeetCode 力扣算法题解汇总,All in One

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: https://fuxuemingzhu.cn 关键词:LeetCode,力扣,算法,题解,汇总,解析 把自己刷过的所有题目做一个整理, ...

  9. 力扣(LeetCode)刷题,简单+中等题(第33期)

    目录 第1题:Z 字形变换 第2题:删除字符串中的所有相邻重复项 第3题:基本计算器 II 第4题:螺旋矩阵 第5题:螺旋矩阵 II 第6题:盛最多水的容器 第7题:删除有序数组中的重复项 II 第8 ...

最新文章

  1. hdu1285 拓扑排序+优先队列
  2. Centos最小化装机网络问题
  3. HDU多校4 - 6808 Go Running(最小点覆盖+网络流优化)
  4. 云计算三种服务模式SaaS、PaaS和IaaS及其之间关系(顺带CaaS、MaaS)
  5. LeetCode MySQL 185. 部门工资前三高的所有员工(dense_rank)
  6. falcon适配ldap密码同步
  7. [转]Windows 7 蓝屏后获取 MEMORY.DMP 文件及注意事项
  8. 【报告分享】2020中国短视频行业洞察报告.pdf(附下载链接)
  9. wireshark的拆包与合并
  10. vlan未能连接服务器,PC单机局域网连接VLAN的方法
  11. 将mysql服务从C盘(原),安装到新路径D盘下(其中的数据一并迁移)
  12. php表格好看样式,用html和css代码实现各种表格样式的总结
  13. 华硕笔记本电脑突然失去WIFI功能
  14. 广告终结者chinalist-easylist语法规则
  15. CAD软件绘图如何提高效率 (下)
  16. 单片机c语言按键防抖程序,单片机按键防抖子程序详情解说 - 全文
  17. Axure学习笔记整理5-灯箱效果
  18. 解决Connection error: (‘Unable to connect to any servers‘, {‘192.168.193.136‘: OperationTimedOut。。。。
  19. uniapp-mixpanel用户行为分析埋点统计插件
  20. CTA-敏感行为-修改联系人(新建/更新/删除)

热门文章

  1. SATA系列专题之五:Link Power Management解析
  2. Cesium中获取地形三角网并进行土方计算
  3. 用户管理“明星”工具——在线客服系统
  4. java记事本(一)
  5. App运营推广过程中,比较实用的工具
  6. 老闪创业那些事儿(38)——小龙的离职面谈
  7. 微信小程序 - tab分页实现
  8. 为云服务器(VPS)增加一个站点支持
  9. pandas合并文件夹下的excel文件
  10. 北航计算机学院保研占比,许明杰:CSP助力保研入北航