Cod sursa(job #1759849)

Utilizator ghost24ghost ghost ghost24 Data 19 septembrie 2016 21:59:36
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include<iostream>
#include<fstream>
#include<string>
#include<stack>
#include<cctype>

using namespace std;
fstream fin("bool.in",ios::in),fout("bool.out",ios::out);
int val[200],put[200],n;
string s,str,aux;
stack<int> nr;
stack<char> op;
char c;

char caracter(int& i);
void evaluare();
void rezolvare();
void trans();

int main()
{
    char i;
    val['!']=3;val['&']=2;val['|']=1;val['t']=1;val['f']=0;
    for(i='A';i<='Z';i++) val[i]=0;
    getline(fin,s);
    trans();
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>c;
        val[c]=!val[c];

        rezolvare();
    }
}
char caracter(int& i)
{
    aux="";
    for(;i<s.size() && isalpha(s[i]);i++) aux+=s[i]; i--;
    if(aux=="FALSE") str+='f';
    if(aux=="TRUE") str+='t';
    if(aux=="NOT") str+='!';
    if(aux=="OR") str+='|';
    if(aux=="AND") str+='&';
    if(aux.size()==1) str+=aux[0];
}
void rezolvare()
{
    for(int i=0;i<str.size();i++)
    {
        if(isalpha(str[i]))
        {
            nr.push(val[str[i]]);
        }
        if(str[i]=='!' || str[i]=='|' || str[i]=='&')
        {
            while(op.empty()==0 && val[op.top()]>val[str[i]])
            {
                evaluare();
            }
            op.push(str[i]);
        }
        if(str[i]=='(')
        {
            op.push(str[i]);
        }
        if(str[i]==')')
        {
            while(op.empty()==0 && op.top()!='(')
            {
                evaluare();
            }
            op.pop();
        }
    }
    while(op.empty()==0)
    {
        evaluare();
    }
    fout<<nr.top();nr.pop();
}
void evaluare()
{
    int a,b;
    b=nr.top(); nr.pop();
    c=op.top(); op.pop();
    if(c=='!'){
        nr.push((!b));return ;
    }
    a=nr.top(); nr.pop();
    if(c=='|') nr.push((a||b));
    if(c=='&') nr.push((a&&b));
}
void trans()
{
    int i;
    for(i=0;i<s.size();i++)
    {
        if(isalpha(s[i])) caracter(i);
        if(s[i]=='(' || s[i]==')') str+=s[i];
    }
}