Cod sursa(job #2672565)

Utilizator rARES_4Popa Rares rARES_4 Data 14 noiembrie 2020 11:01:52
Problema Bool Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.52 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
char sir[1001];
int n,lungime;
bool litere[30];
stack<bool> lit;
stack <char>operatori;
int putere(char semn)
{
    if(semn == '!')
        return 3;
    if(semn == '&')
        return 2;
    if(semn == '|')
        return 1;
    return 0;
}
void evaluare() {
    while (!operatori.empty() && operatori.top() != '(') {
        bool nr1 = lit.top();
        lit.pop();
        char semn = operatori.top();
        operatori.pop();
        bool nr2;
        if (semn != '!') {
            nr2 = lit.top();
            lit.pop();
        }
        switch (semn) {
            case '!':
                lit.push(!nr1);
                break;
            case '&':
                lit.push(nr1 & nr2);
                break;
            case '|':
                lit.push(nr1 | nr2);
                break;
        }
    }
}
bool calc_dupa_semn(bool nr1,bool nr2,char semn)
{
    if(semn == '&')
        return nr1&nr2;
    if(semn == '|')
        return nr1|nr2;
    if(semn == '!')
    {
        nr1 = !nr1;
        semn = operatori.top();
        operatori.pop();
        return calc_dupa_semn(nr1,nr2,semn);
    }
}
bool extrage_si_calculeaza()
{

    char semn = operatori.top();
    operatori.pop();
    if(semn == '!')
    {
        bool nr1 = lit.top();
        lit.pop();
        return !nr1;
    }
    else
    {
        bool nr1 = lit.top();
        lit.pop();
        bool nr2 = lit.top();
        lit.pop();
        return calc_dupa_semn(nr1,nr2,semn);
    }
}
bool eval_expr()
{
    for(int i =0; i<lungime; i++)
    {
        if(sir[i] == ' ')
            continue;
        else if(sir[i] == '(')
        {
            operatori.push('(');
        }
        else if(sir[i] == 'T' && sir[i+1] == 'R')
        {
            lit.push(1);
            i+=3;
        }
        else if(sir[i] == 'F' && sir[i+1] == 'A')
        {
            lit.push(0);
            i+=3;
        }
        else if(sir[i] == 'N' && sir[i+1] == 'O')
        {
            // not are puterea cea mai mare deci niciodata nu va fi mai mic decat cei din fata
            operatori.push('!');
            i+=2;
        }
        else if(sir[i] == 'O' && sir[i+1] == 'R')
        {
            // or are puterea cea mai mica deci se va calcula mereu
            evaluare();
            operatori.push('|');
            i++;
        }
        else if(sir[i] == 'A' && sir[i+1] == 'N')
        {
            // singura operatie cu putere mai mare este not deci se poate calcula and daca are not in fata in stackul de opearatori
            if(!operatori.empty() && operatori.top() == 'N')
                evaluare();
            operatori.push('&');
            i+=2;
        }
        else if(isalpha(sir[i]))
        {
            lit.push(litere[sir[i]-'A']);
        }
        else if(sir[i] == ')')
        {
            evaluare();
            operatori.pop();
        }
    }
    while(!operatori.empty())
    {
        lit.push(extrage_si_calculeaza());
    }
    g << lit.top();
    while(!lit.empty())
        lit.pop();
    while(!operatori.empty())
        operatori.pop();
}
int main()
{
    f.getline(sir,1001);
    lungime = strlen(sir);

    f >> n;
    for(int i = 1; i<=n; i++)
    {
        char litera;
        f >> litera;
        litere[litera-'A'] = !litere[litera-'A'];
        eval_expr();
    }
}