1. 程式人生 > >Basic Calculator II

Basic Calculator II

運算 全部 bstr als ont sub stack substr 元素

該題和前面的"

Basic Calculator

"的處理方法一樣,僅僅是增加了對"*"、"/"兩種運算的支持。

class Solution {
public:
    bool isnum(char c){
        if(c >= '0' && c <= '9')
            return true;
        return false;
    }
    int calculate(string s) {        
        vector<string> postorder;
        stack<char> ccache;
        stack<int> icache;
        string tmp;
        if(s.length() < 1)
            return 0;
//構造後綴表達式
        for(int i = 0; i < s.length(); ){
            if(s[i] == ' '){
                i++;
                continue;
            }
            if(!isnum(s[i])){
                if(s[i] == '(' || ccache.empty()){
                    ccache.push(s[i]);
                    i++;
                    continue;
                }
                if(s[i] == ')'){
                    while(ccache.top() != '('){
                        tmp = "";
                        tmp += ccache.top();
                        postorder.push_back(tmp);
                        ccache.pop();
                    }
                    ccache.pop();
                    i++;
                    continue;
                }
                if(s[i] == '+' || s[i] == '-'){
                    while(!ccache.empty() && ccache.top() != '(' ){
                        tmp = "";
                        tmp += ccache.top();
                        postorder.push_back(tmp);
                        ccache.pop();
                    }
                    ccache.push(s[i]);
                    i++;
                    continue;
                }
                if(s[i] == '*' || s[i] == '/'){
                    while(!ccache.empty() && ccache.top() != '(' && ccache.top() != '+' && ccache.top() != '-'){
                        tmp = "";
                        tmp += ccache.top();
                        postorder.push_back(tmp);
                        ccache.pop();
                    }
                    ccache.push(s[i]);
                    i++;
                    continue;
                }
            }else{
                int j = i;
                while(j < s.length() && isnum(s[j]))
                    j++;
                tmp = "";
                tmp = s.substr(i, j - i);
                postorder.push_back(tmp);
                i = j;
            }
        }
//加入全部剩余的元素
        while(!ccache.empty()){
            tmp = "";
            tmp += ccache.top();
            ccache.pop();
            postorder.push_back(tmp);
        }
//通過後綴表達式計算結果值
            int fir, sec, result;
            for(int i = 0; i < postorder.size(); i++){
                if(postorder[i] == "+" || postorder[i] == "-" || postorder[i] == "*" || postorder[i] == "/"){
                    sec = icache.top();
                    icache.pop();
                    fir = icache.top();
                    icache.pop();
                    
                    if(postorder[i] == "+")
                        result = fir + sec;
                    if(postorder[i] == "-")
                        result = fir - sec;
                    if(postorder[i] == "*")
                        result = fir * sec;
                    if(postorder[i] == "/")
                        result = fir / sec;
                    
                    icache.push(result);
                }else{
                    icache.push(atoi(postorder[i].c_str()));
                }
            }
            return icache.top();
    }
};


Basic Calculator II