先看题目:
第一感觉:
应该是分为各种情况去计算,加减乘除相关的计算。自己先写了一版,比较挫,感觉数字老是比运算符号慢一步
public int calculate(String s) {
int result = 0;
Deque<Integer> stack = new LinkedList<>();
stack.push(1);
int numTemp = 0;
for (int i = 0; i < s.length(); i++) {
Character temp = s.charAt(i);
if (s.charAt(i) == ' ') {
continue;
}
int stackTemp = stack.peek();
if (Character.isDigit(temp)) {
numTemp = getNumericValue((int)temp);
}
switch (temp) {
case '+':
stack.push(numTemp);
break;
case '-':
stack.push(-numTemp);
break;
case '*':
stack.push(numTemp * stack.pop());
break;
case '/':
stack.push(stack.pop() /numTemp);
break;
}
}
for (int i = 0; i < stack.size(); i++) {
result += ((LinkedList<Integer>) stack).get(i);
}
return result;
}
看了网上的解析,理解了原来是先要把数字计算出来,然后再把运算符号给加载进去。其中,初始化一个预置的符号是“+”。
public int calculateSolvedFinally(String s) {
int result = 0;
char sgn = '+';
int nums = 0;
s = s.replace(" ", "");
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
continue;
}
if (Character.isDigit(s.charAt(i))) {
nums = nums * 10 + s.charAt(i) - '0';
}
if(!(s.charAt(i) >= '0' && s.charAt(i) <= '9') || i == s.length() - 1){
switch (sgn) {
case '+':
stack.push(nums);
break;
case '-':
stack.push(-nums);
break;
case '*':
stack.push(stack.pop() * nums);
break;
case '/':
stack.push(stack.pop() / nums);
break;
}
nums = 0;
sgn = s.charAt(i);
}
}
while (!stack.isEmpty()) {
result += stack.pop();
}
return result;
}
这里主要是说一下,自己遇到的几个坑吧:
第一:
在java中如何将string中的每一个字符转换成一个数字?
google了一下,有两种办法,
第一种是通过s.charAt(i) - '0'
这种方式,
第二种是通过numTemp = getNumericValue((int)temp)
,java的库函数。
第二:
为什么将nums定义为这种形式:?
if (Character.isDigit(s.charAt(i))) {
nums = nums * 10 + s.charAt(i) - '0';
}
nums的数字有可能是12, 200,等等,不一定是个位数,这个debug调试一下就了解了。
第三:
为什么if的判断条件中需要进行最后一位的判断?
if(!(s.charAt(i) >= '0' && s.charAt(i) <= '9') || i == s.length() - 1)
需要将最后一步的加减乘除加载进去。
第四:
为什么这样处理空格?
s = s.replace(" ", "");
当没有进行这样处理时,出现最后一位是空格时,会少加一位,所以在一开始直接去掉了空格。这个可以debug调试一下。
对了,推荐一下这篇文章,解释的很好:
https://blog.youkuaiyun.com/h2453532874/article/details/89884504
好了,今天先到这里。
有问题欢迎留言交流~