Pagini recente » Cod sursa (job #2923748) | Cod sursa (job #224549) | Cod sursa (job #1907741) | Cod sursa (job #898129) | Cod sursa (job #2790031)
#include <fstream>
#include <stack>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
string str;
int f[50];
//stiu ca am scis-o urat, o sa o rescriu
int degree(int op)
{
if(op=='!')
return 3;
else if(op=='&')
return 2;
else if(op=='+')
return 1;
return 0;
}
int calculatenot(int a, char op)
{
if(op=='!')
return !a;
}
int calculateoperation2(int a, int b, char op)
{
if(op=='&')
return a && b;
else
return a || b;
}
int evaluate(string str)
{
stack<int>val;
stack<char>op;
for(int i=0;i<str.size();i++)
{
if(str[i]==' ')
continue;
else if(str[i]=='(')
{
op.push(str[i]);
}
else if(str[i]==')')
{
while(op.size()>0 and op.top()!='(')
{
//cout<<op.size()<<endl;
char operation=op.top();
op.pop();
if(operation=='!')
{
int val2=val.top();
calculatenot(val2,operation);
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
val.push(calculateoperation2(val1,val2,operation));
}
}
op.pop();
}
else if(str[i]>='A' and str[i]<='Z')
{
if(str[i]=='O' and str[i+1]>='A' and str[i+1]<='Z')
{
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
i++;
}
char operation='+';
// cout<<op.top()<<" "<<" "<<degree('(')<<" "<<degree(op.top())<<" "<<degree(operation)<<endl;
while(op.size()>0 and degree(op.top())>=degree(operation))
{
if(op.top()=='!')
{
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculatenot(val1,operation));
//cout<<val.top()<<endl;
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculateoperation2(val1,val2,operation));
}
}
op.push('+');
// cout<<i<<endl;
}
else if(str[i]=='A' and str[i+1]>='A' and str[i+1]<='Z')
{
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
i++;
}
char operation='&';
while(op.size()>0 and degree(op.top())>=degree(operation))
{
if(op.top()=='!')
{
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculatenot(val1,operation));
//cout<<val.top()<<endl;
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculateoperation2(val1,val2,operation));
}
}
op.push('&');
}
else if(str[i]=='N' and str[i+1]>='A' and str[i]<='Z')
{
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
i++;
}
char operation='!';
while(op.size()>0 and degree(op.top())>=degree(operation))
{
if(op.top()=='!')
{
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculatenot(val1,operation));
//cout<<val.top()<<endl;
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculateoperation2(val1,val2,operation));
}
}
op.push('!');
}
else if(str[i]=='F' and str[i+1]>='A' and str[i+1]<='Z')
{
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
i++;
}
val.push(0);
}
else if(str[i]=='T' and str[i+1]>='A' and str[i+1]<='Z')
{
while(i<str.size() and str[i]>='A' and str[i]<='Z')
{
i++;
}
val.push(1);
}
else
{
val.push(f[str[i]-'A']);
i++;
}
i--;
}
}
while(op.size()>0)
{
if(op.top()=='!')
{
int val1=val.top();
val.pop();
int operation=op.top();
op.pop();
val.push(calculatenot(val1,operation));
}
else
{
int val2=val.top();
val.pop();
int val1=val.top();
val.pop();
char operation=op.top();
op.pop();
val.push(calculateoperation2(val1,val2,operation));
}
}
int ans=val.top();
val.pop();
return ans;
}
int main()
{
int n;
getline(cin,str);
cin>>n;
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
f[c-'A']^=1;
cout<<evaluate(str);
}
return 0;
}