forked from mJackie/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 11
/
lc227.java
48 lines (46 loc) · 1.49 KB
/
lc227.java
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
package code;
import java.util.Stack;
/*
* 227. Basic Calculator II
* 题意:表达式计算
* 难度:Medium
* 分类:String
* 思路:很巧妙的方法,每次遍历到下一个符号的时候,计算前一个符号的运算,避免了复杂的逻辑。
* + - 运算直接入栈,* / 运算则计算后将结果入栈,实现了 * / 优先运算
* Tips:自己想的方法会非常麻烦。这个解法非常聪明。
*/
public class lc227 {
public int calculate(String s) {
char[] chs = s.replace(" ","").toCharArray();
int num = 0;
char sign = '+';
Stack<Integer> st = new Stack();
for (int i = 0; i < chs.length ; i++) {
if(Character.isDigit(chs[i])){
num = num * 10 + chs[i]-'0';
}
if( !Character.isDigit(chs[i]) || i==chs.length-1 ){ //便利到最后,即使不是符号,也要计算
if(sign=='+'){
st.push(num);
}
else if(sign=='-'){
st.push(-num);
}
else if(sign=='*'){
st.push(st.pop()*num);
}
else if(sign=='/'){
st.push(st.pop()/num);
}
num = 0;
sign = chs[i]; //非常聪明
}
}
int res = 0;
for(Integer i : st){
System.out.println(i);
res += i;
}
return res;
}
}