227 Basic Calculator II 基本计算器II

实现一个基本的计算器来计算一个简单的字符串表达式。

字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 。 整数除法仅保留整数部分。

你可以假定所给定的表达式总是有效的。

一些例子:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5
注意: 不要使用eval 内置的函数库。

详见:https://leetcode.com/problems/basic-calculator-ii/description/

Java实现:

class Solution {
    public int calculate(String s) {
        if(s == null || s.length() == 0){
            return -1;
        }
        
        char sign = '+';
        int cur = 0;
        Stack<Integer> stk = new Stack<Integer>();
        for(int i = 0; i<s.length(); i++){
            char c=s.charAt(i);
            if(Character.isDigit(c)){
                cur = cur*10 + c-'0';
            }
            
            if((!Character.isDigit(c) && c!=' ') || i==s.length()-1){
                if(sign == '-'){
                    stk.push(-cur);
                }else if(sign == '+'){
                    stk.push(cur);
                }else if(sign == '*'){
                    stk.push(stk.pop()*cur);
                }else if(sign == '/'){
                    stk.push(stk.pop()/cur);
                }
                sign = c;
                cur = 0;
            }
        }
        
        int res = 0;
        for(int num : stk){
            res += num; 
        }
        return res;
    }
}

C++实现:

class Solution {
public:
    int calculate(string s) {
        int size=s.size();
        if(size==0||s.empty())
        {
            return 0;
        }
        int res=0,d=0;
        char sign='+';
        stack<int> stk;
        for(int i=0;i<size;++i)
        {
            if(s[i]>='0')
            {
                d=d*10+s[i]-'0';
            }
            if(s[i]<'0'&&s[i]!=' '||i==size-1)
            {
                if(sign=='+')
                {
                    stk.push(d);
                }
                if(sign=='-')
                {
                    stk.push(-d);
                }
                if(sign=='*'||sign=='/')
                {
                    int tmp=sign=='*'?stk.top()*d:stk.top()/d;
                    stk.pop();
                    stk.push(tmp);
                }
                sign=s[i];
                d=0;
            }
        }
        while(!stk.empty())
        {
            res+=stk.top();
            stk.pop();
        }
        return res;
    }
};

参考:https://www.cnblogs.com/grandyang/p/4601208.html

原文地址:https://www.cnblogs.com/xidian2014/p/8758475.html