LeetCode Basic Calculator II(加减乘除计算器)
2016-07-28 16:33
288 查看
与
代码如下:
LeetCode Basic Calculator(用栈计算表达式的值)相似
代码如下:public class Solution { private int cal(int num1, int num2, char op) { switch(op) { case '+': return num1 + num2; case '-': return num1 - num2; case '*': return num1 * num2; case '/': return num1 / num2; default: return 0; } } public int calculate(String s) { String str = s.trim(); Stack<Integer> stackInt = new Stack<Integer>(); Stack<Character> stackChar = new Stack<Character>(); Map<Character, Integer> map = new HashMap<Character, Integer>(); map.put('(', 0); map.put('+', 1); map.put('-', 1); map.put('*', 2); map.put('/', 2); map.put(')', 3); for (int i = 0; i < str.length(); i++) { if (Character.isSpaceChar(str.charAt(i))) { continue; } //为数字,将数据提取出来 if (Character.isDigit(str.charAt(i))) { int sum = 0; int j = i; for (; j < str.length(); j++) { if (Character.isDigit(str.charAt(j))) { sum = sum * 10 + (char)(str.charAt(j) - '0'); } else { break; } } i = j - 1; stackInt.add(sum); } else { //为运行符,如果栈为空,直接入栈 if (stackChar.isEmpty()) { stackChar.add(str.charAt(i)); continue; } //为),则从栈中到运算符,直到遇到( if (str.charAt(i) == ')') { while (!stackChar.isEmpty() && stackChar.peek() != '(') { int num2 = stackInt.pop(); int num1 = stackInt.pop(); char op = stackChar.pop(); int num = cal(num1, num2, op); stackInt.push(num); } if (stackChar.peek() == '(') stackChar.pop(); } else { //如果当前运行符优先级大于栈顶运行符优先级,直接入栈 if (str.charAt(i) != '(' && map.get(str.charAt(i)) > map.get(stackChar.peek())) { stackChar.add(str.charAt(i)); } else { //否则出栈,直到当前运行符优先级大于栈顶运行符优先级 while (!stackChar.isEmpty() && str.charAt(i) != '(' && map.get(str.charAt(i)) <= map.get(stackChar.peek())) { int num2 = stackInt.pop(); int num1 = stackInt.pop(); char op = stackChar.pop(); int num = cal(num1, num2, op); stackInt.push(num); } stackChar.add(str.charAt(i)); } } } } while (!stackChar.isEmpty()) { int num2 = stackInt.pop(); int num1 = stackInt.pop(); char op = stackChar.pop(); int num = cal(num1, num2, op); stackInt.push(num); } return stackInt.pop(); } }
相关文章推荐
- JAVA总结系列之Map
- 软件工程—需求分析
- JAVA通过WebService上传文件
- CocoaPods报错:The dependency '三方框架Name' is not used in any concrete target
- 《es6标准入门》学习笔记-第二章 let和const命令
- 由多线程内存溢出产生的实战分析
- 图片拍照上传和相册选取
- 命名管道(FIFO)
- Android---OnTrimMemory优化
- Spring4笔记----工厂方法配置bean
- 解决webview内存泄露的问题
- Docker容器学习梳理--日常操作总结
- new date() 在Linux下引起的时间差问题
- 搞搞php
- Nohttp请求图片的两种简答的方式:普通请求以及缓存请求
- 旺仔:post请求方式
- 可靠性99.999%互联网微服务的架构设计
- redis 持久化与备份策略
- 关于可变参数的函数
- 安装maven时安照说明配置环境变量JAVA_HOME