はまやんはまやんはまやん

hamayanhamayan's blog

(+ー)の式 [yukicoder No.708]

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;
}