Cod sursa(job #2671791)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 12 noiembrie 2020 18:05:36
Problema Bool Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <map>
#include <stack>
#include <cstring>

using namespace std;

ifstream f("bool.in");
ofstream g("bool.out");

char sir[1005], x;
int n, nrl;
map<char, bool> valori_litere;
stack<char> semne;
stack<bool> numere;

void evaluare_secventa() {
    while (!semne.empty() && semne.top() != '(') {
        bool a = numere.top();
        numere.pop();
        char semn = semne.top();
        semne.pop();
        bool b;
        if (semn != 'N') {
            b = numere.top();
            numere.pop();
        }
        switch (semn) {
            case 'N':
                numere.push(!a);
                break;
            case 'A':
                numere.push(a & b);
                break;
            case 'O':
                numere.push(a | b);
                break;
        }
    }
}

void evaluare() {
    for (int i = 0; i < nrl; ++i) {
        if (sir[i] == '(')
            semne.push('(');
        else if (sir[i] == ')') {
            evaluare_secventa();
            semne.pop();
        } else if (sir[i] == 'N' && sir[i + 1] == 'O') {
            semne.push('N');
            i += 2;
        } else if (sir[i] == 'A' && sir[i + 1] == 'N') {
            if (!semne.empty() && semne.top() == 'N')
                evaluare_secventa();
            semne.push('A');
            i += 2;
        } else if (sir[i] == 'O' && sir[i + 1] == 'R') {
            evaluare_secventa();
            semne.push('O');
            i++;
        } else if (sir[i] == 'T' && sir[i + 1] == 'R') {
            numere.push(true);
            i+=3;
        }
        else if (sir[i] == 'F' && sir[i + 1] == 'A') {
            numere.push(false);
            i+=4;
        }
        else if (isalpha(sir[i]))
            numere.push(valori_litere[sir[i]]);
    }
    evaluare_secventa();
}

int main() {
    f.getline(sir, 1005);
    nrl = strlen(sir);
    f >> n;
    for (int i = 0; i < n; ++i) {
        f >> x;
        valori_litere[x] = !valori_litere[x];
        evaluare();
        g << numere.top();
        numere.pop();
    }
    return 0;
}