LeetCode Basic Calculator II

54 篇文章 0 订阅
19 篇文章 0 订阅

原题链接在这里:https://leetcode.com/problems/basic-calculator-ii/

Basic Calculator类似。

思路: 扫一遍string,遇见数字时看栈顶是不是 '*' 或者 '/',若不是,就压栈,若是就取出栈顶两个元素算结果,再押回栈。

遇见符号就压栈。

基本就是先算了 乘除运算。

剩下栈里的就是加减运算了。这里注意需用到翻转栈, 使用了 Collections.reverse(stk).

Time O(n), Space O(n).

AC Java:

public class Solution {
    public int calculate(String s) {
        if(s == null || s.length() == 0 ){
            return Integer.MIN_VALUE;
        }
        int res = 0;
        Stack<Integer> stk = new Stack<Integer>();
        
        for(int i = 0; i<s.length(); i++){
            if(Character.isDigit(s.charAt(i))){
                int cur = (int)(s.charAt(i)-'0');
                while((i+1)<s.length() && Character.isDigit(s.charAt(i+1))){
                    cur = cur*10 + (int)(s.charAt(i+1) - '0');
                    i++;
                }
                if(!stk.empty() && (stk.peek() == Integer.MIN_VALUE+2 || stk.peek() == Integer.MIN_VALUE+3)){
                    if(stk.peek() == Integer.MIN_VALUE+2){
                        stk.pop();
                        cur = stk.pop()*cur;
                        stk.push(cur);
                    }
                    if(stk.peek() == Integer.MIN_VALUE+3){
                        stk.pop();
                        cur = stk.pop()/cur;
                        stk.push(cur);
                    }
                }else{
                    stk.push(cur);
                }
                
            }else{
                switch(s.charAt(i)){
                    case '+':
                        stk.push(Integer.MIN_VALUE);
                        break;
                    case '-':
                        stk.push(Integer.MIN_VALUE+1);
                        break;
                    case '*':
                        stk.push(Integer.MIN_VALUE+2);
                        break;
                    case '/':
                        stk.push(Integer.MIN_VALUE+3);
                        break;
                    default:
                        continue;
                }
            }
            
        }
        if(stk.empty()) 
            return res;
        Collections.reverse(stk);   //error
        res = stk.pop();
        while(!stk.empty()){
            int oper = stk.pop();
            int num = stk.pop();
            if(oper == Integer.MIN_VALUE){
                res += num;
            }else{
                res -= num;
            }
        }
        return res;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值