Cod sursa(job #1832564)

Utilizator TherevengerkingSurani Adrian Therevengerking Data 20 decembrie 2016 13:22:15
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.65 kb
#include <iostream>
#include <fstream>
#include <stack>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
stack <int>S;
string s;
bool negare(bool x);
bool islit(char x);
bool eval()
{
    bool termen,termen2;
    if(!S.empty())
    {
        if(S.top()==-5)
        {
            S.pop();
            termen=eval();
        }
        else
        {
            termen=S.top();
            S.pop();
        }
    }
    if(!S.empty())
        if(S.top()==2)
        {
            termen=negare(termen);
            S.pop();
        }
    cout<<"Am intrat in eval "<<termen<<'\n';
    while(!S.empty() && S.top()!=5)
        {
            cout<<"Am intrat in eval "<<termen<<'\n';
            if(S.top()==-5)
            {
                S.pop();
                termen2=eval();
            }
            else
            {
                int op;
                if(!S.empty() && S.top()!=5)
                {
                    op=S.top();S.pop();
                    if(S.top()==-5)
                    {
                        S.pop();
                        termen2=eval();
                    }
                    else
                    {
                        termen2=S.top();S.pop();
                    }
                    if(!S.empty())
                        if(S.top()==2)
                            termen2=negare(termen2);
                    if(op==3){
                        if(termen==1 && termen2==1)termen=1; else termen =0;}
                    if(op==4){
                        if(termen==1 || termen2==1)termen=1; else termen=0;}
                }
            }
        }
    if(!S.empty())S.pop();
    return termen;
}
bool negare(bool x)
{
    return x==0;
}
bool islit(char x)
{
    return x<=90 && x>=65;
}
bool lit[90+3];
int n;
int main()
{
    getline(fin,s);
    fin>>n;
    for(int r=1;r<=n;++r)
    {
        char l;
        fin>>l;
        if(lit[l]==1)lit[l]=0;
        else lit[l]=1;
        for(int i=0;i<s.size();++i)
        {
            if(islit(s[i]) && (s[i+1]==' ' or s[i+1]==')') && (i==0 or s[i-1]==' ' or s[i-1]=='('))S.push(lit[s[i]]);
            else
            {
                if(s[i]=='N' && s[i+1]=='O')S.push(2);
                else if(s[i]=='A' && s[i+1]=='N')S.push(3);
                else if(s[i]=='O' && s[i+1]=='R')S.push(4);
                else if(s[i]=='T' && s[i+1]=='R')S.push(1);
                else if(s[i]=='F' && s[i+1]=='A')S.push(0);
                else if(s[i]=='(')S.push(5);
                else if (s[i]==')')S.push(-5);
            }
        }
        fout<<eval();
    }
    return 0;
}