Cod sursa(job #2074749)

Utilizator natrovanCeval Marius natrovan Data 24 noiembrie 2017 23:24:43
Problema Bool Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.57 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <stack>

using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
int N,i,aux[100],x,y,k;
char s[100],v[1000];
stack<char>ST;
queue<char>FP;
queue<char>q1;
queue<char>q2;
stack<int>STN;
int operatie(char o){
x=STN.top();
STN.pop();
if(o=='!')return !x;
else{
y=STN.top();
STN.pop();
if(o=='|')return x||y;
else return x&&y;
    }

}
int prioritate(char o)
{
    switch(o)
    {
        case'O':return 1;
        case'|':return 1;
        case'A':return 2;
        case'&':return 2;
        case'N':return 3;
        case'!':return 3;
        }return 0;
}



int main()
{
    fin.getline(s,100);
    fin>>N;
    for(i=1;i<=N;++i)fin>>v[i];
    ST.push('(');
   for(i=0;s[i];++i)
    {if(s[i]!=' ')
        if(s[i]=='T'&&s[i+1]=='R'){FP.push('1');i+=3;}
        else if(s[i]=='F'&&s[i+1]=='A'){FP.push('0');i+=4;}
        else if(s[i]=='(')ST.push('(');
        else if(s[i]>='A'&&s[i]<='Z'&&!(s[i+1]>='A'&&s[i+1]<='Z'))FP.push(s[i]);
        else if(s[i]==')'){
            while(ST.top()!='('){
                    FP.push(ST.top());
                    ST.pop();
                  }
            ST.pop();
            }
        else{
            while(prioritate(s[i])<prioritate(ST.top())){
                FP.push(ST.top());
                ST.pop();
            }
            if(s[i]=='A'){ST.push('&');i+=2;}
            else if(s[i]=='O'){ST.push('|');++i;}
            else{ST.push('!');i+=2;}
        }


    }
    while(ST.top()!='(') {FP.push(ST.top());
                              ST.pop();}

   while(!FP.empty()){
                 if(FP.front()>='A'&&FP.front()<='Z'){aux[FP.front()]=-1;
                    if(aux[FP.front()]==1)STN.push(aux[FP.front()]);
                    else STN.push(0);
                    q1.push(FP.front());
                    FP.pop();
                }
            else {operatie(FP.front());q1.push(FP.front());FP.pop();}
    fout<<STN.top();
    for(i=0;i<=N;++i){k=1;
    while(!STN.empty())STN.pop();
            if(i%2==0){
            while(!q1.empty())
                if(q1.front()==v[i]&&k>0){
                        aux[q1.front()]*=-1;
                        --k;
                        if(aux[q1.front()]==1)STN.push(aux[q1.front()]);
                        else STN.push(0);
                        q2.push(q1.front());
                        q1.pop();}
                else if(q1.front()>='A'&&q1.front()<='Z'){
                    if(aux[q1.front()]==1)STN.push(aux[q1.front()]);
                    else STN.push(0);
                    q2.push(q1.front());
                    q1.pop();
                }


            else {operatie(q1.front());q2.push(q1.front());q1.pop();}
            cout<<STN.top();}
            else{
                    while(!q2.empty()){
                if(q2.front()==v[i]&&k>0){
                        aux[q2.front()]*=-1;
                        --k;
                        if(aux[q2.front()]==1)STN.push(aux[q2.front()]);
                        else STN.push(0);
                        q1.push(q2.front());
                        q2.pop();}
                else if(q2.front()>='A'&&q2.front()<='Z'){
                    if(aux[q2.front()]==1)STN.push(aux[q2.front()]);
                    else STN.push(0);
                    q1.push(q2.front());
                    q2.pop();
                }
            else {operatie(q2.front());q1.push(q2.front());q2.pop();}
            cout<<STN.top();}

            }

    }}
    return 0;
   }