题目

https://leetcode.com/problems/basic-calculator-ii/

题解

这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起来不是那么舒服的地方:

1、题目中包含空格,造成了一些干扰,需要忽略

2、输入是一个字符串,导致数字需要拼接出来,无法直接使用 split 区分数字和运算符

经典的中缀表达式求值过程如下

本题代码
import java.util.HashMap;
import java.util.Stack;class Solution {HashMap<Character, Integer> priorityMap; // 运算符优先级public int calculate(String s) {initPriortyMap();char[] arr = s.toCharArray();Stack<Integer> s1 = new Stack<>(); // 操作数栈Stack<Character> s2 = new Stack<>(); // 运算符栈int cur = 0;for (int i = 0; i < arr.length; i++) {if (arr[i] >= '0' && arr[i] <= '9') { // 是数字cur *= 10;cur += arr[i] - '0';} else if (priorityMap.get(arr[i]) != null) { // 是运算符s1.push(cur);cur = 0;if (s2.isEmpty() || isPrior(arr[i], s2.peek())) { // 若当前运算符大于栈顶运算符优先级 则入栈s2.push(arr[i]);} else { // 否则 在当前运算符小于等于栈顶运算符情况下 不断出栈并运算 将运算结果入操作数栈while (s2.size() > 0 && !isPrior(arr[i], s2.peek())) {Character op = s2.pop();Integer n1 = s1.pop();Integer n2 = s1.pop();int res = cal(n1, n2, op);s1.push(res);}s2.push(arr[i]);}}if (i == arr.length - 1) s1.push(cur);}while (!s2.isEmpty()) { // 运算符栈中还有剩余 则一直出栈并运算Character op = s2.pop();Integer n1 = s1.pop();Integer n2 = s1.pop();int res = cal(n1, n2, op);s1.push(res);}return s1.pop();}public boolean isPrior(char op1, char op2) {return priorityMap.get(op1) > priorityMap.get(op2);}public void initPriortyMap() {priorityMap = new HashMap<>(); // 运算符优先级priorityMap.put('+', 0);priorityMap.put('-', 0);priorityMap.put('*', 1);priorityMap.put('/', 1);}public int cal(int n1, int n2, char op) {switch (op) {case '+':return n2 + n1;case '-':return n2 - n1;case '*':return n2 * n1;case '/':return n2 / n1;default:System.out.println("op err: " + op);return -1;}}
}

官方题解

针对没有左右括号的中缀表达式,官方给的题解确实比我的方法简化了很多。

但如果要改造成标准的 包含左右括号的 中缀表达式求值的话,我认为还是我写的上面的版本比较容易改造。

class Solution {public int calculate(String s) {if (s == null || s.isEmpty()) return 0;int len = s.length();Stack<Integer> stack = new Stack<Integer>();int currentNumber = 0;char operation = '+';for (int i = 0; i < len; i++) {char currentChar = s.charAt(i);if (Character.isDigit(currentChar)) {currentNumber = (currentNumber * 10) + (currentChar - '0');}if (!Character.isDigit(currentChar) && !Character.isWhitespace(currentChar) || i == len - 1) {if (operation == '-') {stack.push(-currentNumber);}else if (operation == '+') {stack.push(currentNumber);}else if (operation == '*') {stack.push(stack.pop() * currentNumber);}else if (operation == '/') {stack.push(stack.pop() / currentNumber);}operation = currentChar;currentNumber = 0;}}int result = 0;while (!stack.isEmpty()) {result += stack.pop();}return result;}
}

leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)相关推荐

  1. leetcode 224. Basic Calculator | 224. 基本计算器(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator/ 题解 中缀表达式求值,之前学数据结构的笔记: class Solution {public int ...

  2. leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

    题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...

  3. html算术计算,js实现计算器 提供算术表达式求值

    //html 计算器 @import "calculator.css"; //CSS /* CSS Document */ body { /*   padding-right:40 ...

  4. 数据结构栈之中缀表达式求值(实现计算器综合计算)

    一.思路分析: 1.通过一个index值(索引),来遍历我们的表达式. 2.如果我们发现是一个数字,就直接入数栈. 3.如果发现扫描到是一个符号,就分如下情况: (1).如果发现当前的符号栈为空,就直 ...

  5. 计算器c语言代码中缀表达式,C语言实现中缀表达式求值,计算器的简单实现

    #include #include typedef struct//操作数栈 { double *top; double *base; int listsize; }List; typedef str ...

  6. 数据结构与算法 | LeetCode 224. Basic Calculator

    原文链接:https://wangwei.one/posts/alg... 前面,我们学习了 栈的实现及其应用 ,今天我们基于栈,来实现一个简单的计算器功能. 简单计算器实现 Leetcode 224 ...

  7. LeetCode OJ Basic Calculator II

    Basic Calculator II 题目 思路 和这个一样:Basic Calculator I 代码 class ExpressionTransformation { public:string ...

  8. 字符串算术表达式求值-简单计算器实现(栈)-数据结构和算法(Java)

    1 字符串算术表达式分类 字符串算术表达式分为前缀表达式.中缀表达式和后缀表达式.其中前缀表达式又称波兰表达式,后缀表达式基于前缀表达式,又称逆波兰表达式.下面给出百度百科关于几种表达式的定义: 前缀 ...

  9. 计算器软件----表达式求值

    学完栈写了一个计算器小程序, 基本功能如下: 1.支持基本的+ - * / % 运算 2.支持sin.cos.tan.ln.log.乘方(^).开方(sqrt).指数(exp) 求值 3.支持括号及括 ...

最新文章

  1. Go 知识点(15)— 切片长度和容量
  2. 查询数据库返回cursor,如何判断没有符合条件的记录。判断条件不是cursor==null 哦
  3. centos7 mariadb mysql max_connections=214 无法修改的问题
  4. SharePoint 2007 如果在计算列中使用Today变量
  5. 开放封闭原则(OCP)
  6. 学习LOAM笔记——特征点提取与匹配
  7. Vue中使用input简易的上传图片
  8. 巧用Newtonsoft.Json处理重复请求/并发请求?
  9. sqlserver游标概念与实例全面解说
  10. 王道考研 计算机网络5 分层结构 协议 服务 接口
  11. 最近公司遇到了APR攻击,顺便了解一下知识
  12. Android 应用开发(37)---RelativeLayout(相对布局)
  13. 计算机二级怎么让试题变简单,如何有效利用历年真题备考全国计算机等级考试?...
  14. linux gz解压 指定目,linux解压tar.gz到指定文件夹或目录
  15. 修改ssh服务端访问端口号
  16. Matlab GUI的数据传递——运用GUI本身的varargin和varargout传递参数
  17. 排队系统利用分布式设计的思考
  18. Spring的运行原理
  19. Leetcode Golang 77. Combinations.go
  20. Intune在个人设备中保护企业数据的MAM解决方案

热门文章

  1. CodeForces - 1348C Phoenix and Distribution(思维)
  2. LightOJ - 1222 Gift Packing(最大费用最大流/KM)
  3. POJ - 3926 Parade(单调队列优化dp)
  4. web项目怎么打包上线_高级前端web工程师简历范文,【工作经历+项目经验+自我评价】怎么写...
  5. 视音频编解码学习工程:H.264分析器
  6. Kafka设计解析(四):Kafka Consumer解析
  7. 注入dll到一个进程里面
  8. Android app native代码性能分析
  9. 知乎热榜:如何获得高并发的经验?
  10. 延时队列实现的几种姿势