1. 题目
https://leetcode.cn/problems/basic-calculator/
2. 解法
解题思路:
- 使用两个栈,一个存储数字,一个存储运算符
- 遍历字符串,如果遇到数字,就将其转换为整数并压入数字栈
- 如果遇到运算符,就比较其与运算符栈顶的优先级,如果高于或等于栈顶的优先级,就压入运算符栈;如果低于栈顶的优先级,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到运算符栈为空或者栈顶的优先级低于当前运算符
- 如果遇到左括号,就直接压入运算符栈
- 如果遇到右括号,就从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,重复这个过程直到遇到左括号,并将左括号弹出
- 遍历完字符串后,如果运算符栈不为空,就继续从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行计算,并将结果压入数字栈,直到运算符栈为空
- 最后从数字栈中弹出最终结果并返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | public class Solution { public int calculate(String s) { // 去除空格 s = s.replaceAll( " " , "" ); // 创建两个栈 Stack<Integer> numStack = new Stack<>(); // 存储数字 Stack<Character> opStack = new Stack<>(); // 存储运算符 // 遍历字符串 for ( int i = 0 ; i < s.length(); i++) { char c = s.charAt(i); if (Character.isDigit(c)) { // 如果是数字 // 将连续的数字转换为整数 int num = c - '0' ; while (i + 1 < s.length() && Character.isDigit(s.charAt(i + 1 ))) { num = num * 10 + (s.charAt(i + 1 ) - '0' ); i++; } // 将整数压入数字栈 numStack.push(num); } else if (c == '+' || c == '-' ) { // 如果是加号或减号 // 比较当前运算符与栈顶运算符的优先级 while (!opStack.isEmpty() && opStack.peek() != '(' ) { // 如果栈顶运算符的优先级高于或等于当前运算符,就进行计算 int num2 = numStack.pop(); int num1 = numStack.pop(); char op = opStack.pop(); int res = calculate(num1, num2, op); // 将计算结果压入数字栈 numStack.push(res); } // 将当前运算符压入运算符栈 opStack.push(c); } else if (c == '(' ) { // 如果是左括号 // 直接压入运算符栈 opStack.push(c); } else if (c == ')' ) { // 如果是右括号 // 从栈中弹出数字和运算符进行计算,直到遇到左括号 while (!opStack.isEmpty() && opStack.peek() != '(' ) { int num2 = numStack.pop(); int num1 = numStack.pop(); char op = opStack.pop(); int res = calculate(num1, num2, op); numStack.push(res); } // 将左括号弹出 opStack.pop(); } } // 遍历完字符串后,如果运算符栈不为空,就继续进行计算,直到运算符栈为空 while (!opStack.isEmpty()) { int num2 = numStack.pop(); int num1 = numStack.pop(); char op = opStack.pop(); int res = calculate(num1, num2, op); numStack.push(res); } // 最后从数字栈中弹出最终结果并返回 return numStack.pop(); } // 定义一个辅助方法,用于计算两个数字和一个运算符的结果 private int calculate( int num1, int num2, char op) { if (op == '+' ) { return num1 + num2; } else if (op == '-' ) { return num1 - num2; } else { return 0 ; // 不会发生的情况 } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2021-04-25 Dubbo源码分析(十)同步调用与异步调用
2021-04-25 Dubbo源码分析(九)负载均衡算法
2021-04-25 Dubbo源码分析(八)集群容错机制
2021-04-25 Dubbo源码分析(七)服务目录
2021-04-25 Dubbo源码分析(六)服务引用的具体流程
2021-04-25 Dubbo源码分析(五)服务暴露的具体流程(下)
2021-04-25 Dubbo源码分析(四)服务暴露的具体流程(上)