Pagini recente » Cod sursa (job #2029339) | Cod sursa (job #3284798) | Cod sursa (job #1981543) | Cod sursa (job #2015888) | Cod sursa (job #2074749)
#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;
}