$\newcommand{\O}{\mathrm{O}}$
() を含む四則演算の式をパースし、計算結果を返す.
時間計算量: $\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); } };
AOJ : Smart Calculator 提出コード