Pagini recente » Cod sursa (job #2705677) | Cod sursa (job #2798516) | Cod sursa (job #372328) | Cod sursa (job #667617) | Cod sursa (job #2698972)
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream cin("bool.in");
ofstream cout("bool.out");
char s[1010], t[1010];
bool val[26];
stack<char> sign;
stack<int> num;
inline int Precedence(char ch)
{ if (ch=='!')
return 3;
if (ch=='&')
return 2;
return 1;
}
inline int Evaluate()
{ int j, i, x, y;
memset(s, '\0', sizeof(s));
j=-1;
for (i=0;t[i];++i)
if (t[i]>='A' && t[i]<='Z')
{ s[++j]=val[t[i]-'A']+'0';
s[++j]=' ';
}
else if (t[i]=='0' || t[i]=='1')
{ s[++j]=s[i];
s[++j]=' ';
}
else if (t[i]=='(')
sign.push('(');
else if (t[i]==')')
{ while (sign.top()!='(')
{ s[++j]=sign.top();
sign.pop();
}
sign.pop();
}
else
{ while (!sign.empty() && sign.top()!='(' && Precedence(t[i])<=Precedence(sign.top()))
{ s[++j]=sign.top();
sign.pop();
}
sign.push(t[i]);
}
while (!sign.empty())
{ s[++j]=sign.top();
sign.pop();
}
for (i=0;s[i];++i)
if (s[i]=='0' || s[i]=='1')
num.push(s[i]-'0');
else if (s[i]!=' ')
if (s[i]=='!')
num.top()=!num.top();
else
{ x=num.top();
num.pop();
y=num.top();
num.pop();
if (s[i]=='&')
num.push(x&y);
else
num.push(x|y);
}
x=num.top();
num.pop();
return x;
}
int main()
{ char ch;
int j, i, Q;
cin.getline(s, 1000);
j=-1;
for (i=0;s[i];++i)
if (s[i]=='N' && s[i+1]=='O' && s[i+2]=='T')
t[++j]='!', i+=2;
else if (s[i]=='A' && s[i+1]=='N' && s[i+2]=='D')
t[++j]='&', i+=2;
else if (s[i]=='O' && s[i+1]=='R')
t[++j]='|', ++i;
else if (s[i]=='T' && s[i+1]=='R' && s[i+2]=='U' && s[i+3]=='E')
t[++j]='1', i+=3;
else if (s[i]=='F' && s[i+1]=='A' && s[i+2]=='L' && s[i+3]=='S' && s[i+4]=='E')
t[++j]='0', i+=4;
else if (s[i]!=' ')
t[++j]=s[i];
cin>>Q;
while (Q--)
{ cin>>ch;
ch-='A';
val[ch]=!val[ch];
cout<<Evaluate();
}
cin.close();
cout.close();
return 0;
}