$\newcommand{\O}{\mathrm{O}}$ My Algorithm : kopricky アルゴリズムライブラリ

kopricky アルゴリズムライブラリ

Calculating a Numerical Expression with the Four Basic Arithmetic Operations

コードについての説明

() を含む四則演算の式をパースし、計算結果を返す.

時間計算量: $\O (|S|)$ ($|S|$ は数式の文字数)

コード

template<typename T> class Parser {
private:
    T expr(const string& s, int& pos){
        T res = term(s, pos);
        while(s[pos] == '+' || s[pos] == '-'){
            if(s[pos] == '+'){
                res += term(s, ++pos);
            }else{
                res -= term(s, ++pos);
            }
        }
        return res;
    }
    T term(const string& s, int& pos){
        T res = factor(s, pos);
        while(s[pos] == '*' || s[pos] == '/'){
            if(s[pos] == '*'){
                res *= factor(s, ++pos);
            }else{
                res /= factor(s, ++pos);
            }
        }
        return res;
    }
    T factor(const string& s, int& pos){
        if(isdigit(s[pos])) return number(s, pos);
        ++pos; // '('をとばす
        T res = expr(s, pos);
        ++pos; // ')'をとばす
        return res;
    }
    T number(const string& s, int& pos){
        T res = 0;
        do{
            res *= 10;
            res += (s[pos++] - '0');
        }while(isdigit(s[pos]));
        return res;
    }
 
public:
    Parser(){}
    T solve(const string& s){
        int pos = 0;
        return expr(s, pos);
    }
};

verify 用の問題

AOJ : Smart Calculator 提出コード