Cod sursa(job #2672492)

Utilizator rARES_4Popa Rares rARES_4 Data 14 noiembrie 2020 09:10:56
Problema Bool Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.96 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;
}
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()
{
    bool nr1 = lit.top();
    lit.pop();
    bool nr2 = lit.top();
    lit.pop();
    char semn = operatori.top();
    operatori.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')
        {
            while(!operatori.empty() && putere('!')<=putere(operatori.top()))
            {
                lit.push(extrage_si_calculeaza());
            }
            operatori.push('!');
            i+=2;
        }
        else if(sir[i] == 'O' && sir[i+1] == 'R')
        {
            while(!operatori.empty() && putere('|')<=putere(operatori.top()))
            {
                lit.push(extrage_si_calculeaza());
            }
            operatori.push('|');
            i++;
        }
        else if(sir[i] == 'A' && sir[i+1] == 'N')
        {
            while(!operatori.empty() && putere('&')<=putere(operatori.top()))
            {
                lit.push(extrage_si_calculeaza());
            }
            operatori.push('&');
            i+=2;
        }
        else if(isalpha(sir[i]))
        {

            lit.push(litere[sir[i]-'A']);
        }
        else if(sir[i] == ')')
        {
            while(!operatori.empty() && operatori.top()!='(')
            {
                lit.push(extrage_si_calculeaza());
            }
            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();
    }
}