LeetCode 227. 基本计算器 (Java)
Posted 爱若信若盼若
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 227. 基本计算器 (Java)相关的知识,希望对你有一定的参考价值。
0227. 基本计算器 Basic Calculator II(Medium)
##Stack##, ##String##
在没有括号的情况下,算术表达式情况较为简单
乘除优先于加减运算,因此考虑先进行乘除运算,运算结果放回原表达式中,原表达式变为一系列正整数加减后的值
遍历整个字符串s
,用变量preSign
记录每个数字前的操作符,当遍历完一个数字后,根据preSign
决定计算计算方法
- 加号:直接将该数加入栈中
- 减号:取该数相反数加入栈中
- 乘除号:取栈顶元素与当前数字进行相应操作后放入栈中
初始化时,将第一个遍历的数字的preSign
符号看作加号;当遍历到一个运算符或遍历到字符串结尾时,都可以视作遍历完一个数字,此时应该进行相应计算操作,并更新preSign
遍历完整个字符串后,将栈中元素累加,即为该字符串表达式的值
时间复杂度: O ( n ) O(n) O(n)
class Solution {
public int calculate(String s) {
int res = 0, num = 0;
Stack<Integer> sta = new Stack<Integer>();
char preSign = '+';
int len = s.length();
for (int i = 0; i < len; i ++) {
char ch = s.charAt(i);
if (Character.isDigit(ch)) {
num = num * 10 + ch - '0';
}
if ((!Character.isDigit(ch) && ch != ' ') || i == len - 1) {
if (preSign == '+') {
sta.push(num);
} else if (preSign == '-' ) {
sta.push(-1 * num);
} else if (preSign == '*') {
sta.push(num * sta.pop());
} else if (preSign == '/') {
sta.push(sta.pop() / num);
}
num = 0;
preSign = ch;
}
}
while (!sta.isEmpty()) {
res += sta.pop();
}
return res;
}
}
以上是关于LeetCode 227. 基本计算器 (Java)的主要内容,如果未能解决你的问题,请参考以下文章