Cod sursa(job #1840572)

Utilizator andreix2cAndrei Cosmin andreix2c Data 4 ianuarie 2017 16:19:24
Problema Bool Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.27 kb
#include <fstream>
#include <stack>
#include <deque>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
struct expresion
{
    short int n;//0=char,1=bool,2=operator
    char c;
    bool b;
    short x;//0=left paranthesis,1=right paranthesis,2=OR,3=AND,4=NOT
};
struct node
{
    expresion e;
    node *st=NULL,*dr=NULL;
}*R=NULL;
bool values[26];
int l;
stack<short>stk;
deque<expresion>infix,postfix;
bool expressionValue(node*r)
{
    if(r->e.n==0)
        return values[r->e.c-'A'];
    else if(r->e.n==1)
        return r->e.b;
    else
    {
        if(r->e.x==2)
            return expressionValue(r->st)||expressionValue(r->dr);
        else if(r->e.x==3)
            return expressionValue(r->st)&&expressionValue(r->dr);
        else return !expressionValue(r->st);
    }
}
void printExpresion(expresion e)
{
    if(e.n==0)
        g<<e.c<<" ";
    else if(e.n==1)
        g<<boolalpha<<e.b<<" ";
    else g<<e.x<<" ";
    g<<noboolalpha;
}
node* createNode()
{
    node*r=new node;
    if(postfix[l].n==2)
    {
        if(postfix[l].x==4)
        {
            r->e=postfix[l];
            l--;
            r->st=createNode();
        }
        else
        {
            r->e=postfix[l];
            l--;
            r->st=createNode();
            r->dr=createNode();
        }
    }
    else
    {
        r=new node;
        r->e=postfix[l];
        l--;
    }
    return r;
}
void infixToPostfix()
{
    short n=infix.size();
    expresion aux;
    aux.n=2;
    stk.push(-1);
    for(int i=0; i<n; i++)
    {
        if(infix[i].n==0||infix[i].n==1)
            postfix.push_back(infix[i]);
        else
        {
            if(infix[i].x==0)
                stk.push(infix[i].x);
            else
            {
                if(infix[i].x==1)
                {
                    while(stk.top()!=0)
                    {
                        aux.x=stk.top();
                        postfix.push_back(aux);
                        stk.pop();
                    }
                    stk.pop();
                }
                else
                {
                    if(stk.top()<infix[i].x)
                        stk.push(infix[i].x);
                    else
                    {
                        while(stk.top()>=infix[i].x)
                        {
                            aux.x=stk.top();
                            postfix.push_back(aux);;
                            stk.pop();
                        }
                        stk.push(infix[i].x);
                    }
                }
            }
        }
    }
    while(stk.top()!=-1)
    {
        aux.x=stk.top();
        postfix.push_back(aux);
        stk.pop();
    }
}
/*void srd(node*R)
{
    if(R)
    {
        srd(R->st);
        printExpresion(R->e);
        srd(R->dr);
    }
}*/
void readInfix()
{
    short n;
    char s[1001];
    expresion aux;
    f.getline(s,1001);
    n=strlen(s);
    for(int i=0; i<n; i++)
    {
        if(s[i]==' ')
            continue;
        if(s[i]=='(')
        {
            aux.n=2;
            aux.x=0;
            infix.push_back(aux);
        }
        else if(s[i]==')')
        {
            aux.n=2;
            aux.x=1;
            infix.push_back(aux);
        }
        else if(i+1==n)
        {
            aux.n=0;
            aux.c=s[i];
            infix.push_back(aux);
        }
        else if(s[i]>='A'&&s[i]<='Z'&&!(s[i+1]>='A'&&s[i+1]<='Z'))
        {
            aux.n=0;
            aux.c=s[i];
            infix.push_back(aux);
        }
        else
        {
            if(s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
            {
                aux.n=2;
                aux.x=3;
                infix.push_back(aux);
                i+=2;
            }
            else if(s[i]=='O'&&s[i+1]=='R')
            {
                aux.n=2;
                aux.x=2;
                infix.push_back(aux);
                i++;
            }
            else if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
            {
                aux.n=2;
                aux.x=4;
                infix.push_back(aux);
                i+=2;
            }
            else if(s[i]=='T'&&s[i+1]=='R'&&s[i+2]=='U'&&s[i+3]=='E')
            {
                aux.n=1;
                aux.b=true;
                infix.push_back(aux);
                i+=3;
            }
            else if(s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S'&&s[i+4]=='E')
            {
                aux.n=1;
                aux.b=false;
                infix.push_back(aux);
                i+=3;
            }
        }
    }
}
int main()
{
    char ch;
    short n;
    readInfix();
    infixToPostfix();
    /*for(int i=0; i<infix.size(); i++)
        printExpresion(infix[i]);
    g<<endl;
    for(int i=0; i<postfix.size(); i++)
        printExpresion(postfix[i]);
    g<<endl;*/
    l=postfix.size()-1;
    R=createNode();
    //srd(R);
    //g<<endl;
    f>>n;
    f.get();
    for(int i=0; i<n; i++)
    {
        f>>ch;
        values[ch-'A']=!values[ch-'A'];
        //g<<values[ch-'A']<<endl;
        g<<expressionValue(R);
    }
    f.close();
    g.close();
    return 0;
}