原题链接在这里:https://leetcode.com/problems/evaluate-reverse-polish-notation/
思路: 利用栈,遇到数字就压栈,遇到运算符就先pop() op2, 再pop() op1, 按op1 运算符op2 计算,得出结果压回栈,最后站内 剩下的就是结果。
Note: 1.String str to character, use str.toCharArray(), 转化成了一个char的array.
2. 若是负数,首字符也是负号,需要分类讨论
3. while loop, 别忘了j++.
AC Java:
public class Solution {
public int evalRPN(String[] tokens) {
if(tokens == null || tokens.length == 0){
return 0;
}
int res = 0;
Stack<Integer> stk = new Stack<Integer>();
for(int i = 0; i<tokens.length; i++){
char [] charArr = tokens[i].toCharArray();
if(Character.isDigit(charArr[0])){
int cur = (int)(charArr[0] - '0');
int j = 1;
while(j<charArr.length && Character.isDigit(charArr[j])){ //error
cur = cur*10 + (int)(charArr[j] - '0');
j++; //error
}
stk.push(cur);
}else if(charArr.length > 1 && charArr[0] == '-' && Character.isDigit(charArr[1])){
int cur = (int)(charArr[1] - '0');
int j = 2;
while(j<charArr.length && Character.isDigit(charArr[j])){
cur = cur*10 + (int)(charArr[j] - '0');
j++;
}
stk.push(cur * (-1));
}else if(charArr[0] == '+'){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1+op2);
}else if(charArr.length == 1 && charArr[0] == '-' ){ //error
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1-op2);
}else if(charArr[0] == '*'){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1*op2);
}else if(charArr[0] == '/'){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1/op2);
}else{
continue;
}
}
if(!stk.empty()){
res = stk.pop();
}
return res;
}
}
上面的写法显得啰嗦,可以做如下改动。
Note: 1.可以直接使用Integer.valueOf(str)来得到数值。
2. In "if" statement, 比较两个str时,不能使用 == operator,必须使用str1.equals(str2).
3. 当stack使用pop() 或者 peek()时需要先检查stack是否为空。
AC Java:
public class Solution {
public int evalRPN(String[] tokens) {
if(tokens == null || tokens.length == 0){
return 0;
}
int res = 0;
Stack<Integer> stk = new Stack<Integer>();
for(int i = 0; i<tokens.length; i++){
if(tokens[i].equals("+")){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1+op2);
}else if(tokens[i].equals("-")){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1-op2);
}else if(tokens[i].equals("*")){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1*op2);
}else if(tokens[i].equals("/")){
int op2 = stk.pop();
int op1 = stk.pop();
stk.push(op1/op2);
}else{
stk.push(Integer.valueOf(tokens[i]));
}
}
if(!stk.empty()){
res = stk.pop();
}
return res;
}
}