https://yukicoder.me/problems/no/708
前提知識
解法
https://yukicoder.me/submissions/270306
構文解析をするだけなのだが、慣れないと厳しい。
特に今回は1+3-4+3のように全てが「数?数」になっている訳ではないのでちょっと大変。
以下では、演算子を処理する関数fと数とカッコを処理する関数gに分けて実装している。
どちらの関数でも言えることだが、処理を戻すときは文字列の添字を次に処理すべき所に移してから
戻すことを徹底する。ココらへんを曖昧にすると書いてて分からなくなる。
string S; int i = 0; ll f(); //--------------------------------------------------------------------------------------------------- ll g() { if ('0' <= S[i] and S[i] <= '9') { ll res = S[i] - '0'; i++; return res; } if (S[i] == '(') { i++; ll res = f(); i++; return res; } } ll f() { ll res = g(); while (1) { if (S[i] == '+') { i++; res += g(); } else if (S[i] == '-') { i++; res -= g(); } else return res; } } //--------------------------------------------------------------------------------------------------- void _main() { cin >> S; cout << f() << endl; }