Cod sursa(job #1166410)

Utilizator stefanzzzStefan Popa stefanzzz Data 3 aprilie 2014 16:04:52
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.65 kb
#include <fstream>
#include <vector>
#define MAXC 1005
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");

struct nod{
    bool val;
    char var,op;
    nod *fiu[2];
    nod(){
        val=0;
        var='0';
        op='0';
        fiu[0]=fiu[1]=NULL;}};

nod *rad;
int n,priority[300];
char s[MAXC],*p,c;
vector<nod *> stivavar;
vector<char> stivaop;

void build_expression_tree();
bool eval(nod *a);

int main()
{
    int i;
    f.getline(s+1,MAXC,'\n');
    p=s+1;
    build_expression_tree();
    f>>n;
    f.getline(s+1,MAXC,'\n');
    f.getline(s+1,MAXC,'\n');
    for(i=1;i<=n;i++){
        c=s[i];
        g<<eval(rad);}
    f.close();
    g.close();
    return 0;
}

void build_expression_tree(){
    nod *a;
    priority[(int)('!')]=3;priority[(int)('&')]=2;priority[(int)('|')]=1;
    while(*p!='\0'){
        if(*p==' '){
            p++;
            continue;}
        if(*p=='('){
           stivaop.push_back('(');
           p++;
           continue;}
        if(*p>='A'&&*p<='Z'&&(*(p+1)<'A'||*(p+1)>'Z')){
            a=new nod;
            a->var=(*p);
            stivavar.push_back(a);
            p++;
            continue;}
        if(*p==')'){
            while(stivaop.back()!='('){
                a=new nod;
                a->op=stivaop.back();
                stivaop.pop_back();
                if(a->op=='!'){
                    a->fiu[0]=stivavar.back();
                    stivavar.pop_back();
                    stivavar.push_back(a);
                    continue;}
                a->fiu[1]=stivavar.back();stivavar.pop_back();
                a->fiu[0]=stivavar.back();stivavar.pop_back();
                stivavar.push_back(a);}
            stivaop.pop_back();
            p++;
            continue;}
        if(*p=='T'){
            a=new nod;
            a->val=1;
            stivavar.push_back(a);
            p+=4;
            continue;}
        if(*p=='F'){
            a=new nod;
            p+=5;
            stivavar.push_back(a);
            continue;}
        if(*p=='N'){
            stivaop.push_back('!');
            p+=3;
            continue;}
        if(*p=='O'){
            c='|';
            p+=2;}
        else{
            c='&';
            p+=3;}
        while(!stivaop.empty()&&priority[(int)(stivaop.back())]>=priority[(int)(c)]){
            a=new nod;
            a->op=stivaop.back();
            stivaop.pop_back();
            if(a->op=='!'){
                a->fiu[0]=stivavar.back();
                stivavar.pop_back();
                stivavar.push_back(a);
                continue;}
            a->fiu[1]=stivavar.back();stivavar.pop_back();
            a->fiu[0]=stivavar.back();stivavar.pop_back();
            stivavar.push_back(a);}
        stivaop.push_back(c);}
    while(!stivaop.empty()){
        a=new nod;
        a->op=stivaop.back();
        stivaop.pop_back();
        if(a->op=='!'){
            a->fiu[0]=stivavar.back();
            stivavar.pop_back();
            stivavar.push_back(a);
            continue;}
        a->fiu[1]=stivavar.back();stivavar.pop_back();
        a->fiu[0]=stivavar.back();stivavar.pop_back();
        stivavar.push_back(a);}
    rad=stivavar[0];}

bool eval(nod *a){
    if(a->fiu[0]==NULL&a->fiu[1]==NULL){
        if(a->var==c)
            a->val=(!(a->val));}
    else{
        if(a->fiu[1]==NULL)
            a->val=!(eval(a->fiu[0]));
        else{
            if(a->op=='|')
                a->val=(eval(a->fiu[0]))|(eval(a->fiu[1]));
            else
                a->val=(eval(a->fiu[0]))&(eval(a->fiu[1]));}}
    return a->val;}