LeetCode Evaluate Reverse Polish Notation

54 篇文章 0 订阅
16 篇文章 0 订阅

原题链接在这里: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;
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值