Pagini recente » Cod sursa (job #109541) | Cod sursa (job #946086) | Cod sursa (job #1265341) | Cod sursa (job #119913) | Cod sursa (job #1339337)
#include<fstream>
#include<stack>
#include<iostream>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int NMAX = 1000;
char s[NMAX + 5];
int n,val[30],q;
stack<char> op;
stack<int> opd;
int lungime(char c[])
{
int i = 1;
while(c[i] != '\0')
++i;
return i-1;
}
int prioritate(char c)
{
switch(c){
case '(':return 0;
break;
case ')':return 0;
break;
case 'O':return 1;
break;
case 'A':return 2;
break;
case 'N':return 3;
}
return 0;
}
bool e_litera(char c)
{
if(c >= 'A' && c <= 'Z')
return true;
return false;
}
int eval(int a,int b,char o)
{
switch(o){
case 'N':return !a;
break;
case 'A':return (a && b);
break;
case 'O':return (a || b);
break;
}
return 0;
}
void init()
{
while(!op.empty())
op.pop();
while(!opd.empty())
opd.pop();
op.push('(');
}
int solve()
{
int p = 1;
while(p <= n){
if(s[p] == ' ')
++p;
if(s[p] == '('){
op.push(s[p]);
++p;
}
else if(s[p] == 'N' && s[p+1] == 'O'){
op.push('N');
p += 3;
}
else if(s[p] == 'A' && s[p+1] == 'N'){
while(prioritate('A') < prioritate(op.top())){
if(op.top() == 'N'){
int key = opd.top();
opd.pop();
opd.push(eval(key,0,op.top()));
}
op.pop();
}
op.push('A');
p += 3;
}
else if(s[p] == 'O' && s[p+1] == 'R'){
while(prioritate('O') < prioritate(op.top())){
if(op.top() == 'N'){
int key = opd.top();
opd.pop();
opd.push(eval(key,0,op.top()));
}
else if(op.top() == 'A'){
int key1 = opd.top();
opd.pop();
int key2 = opd.top();
opd.top();
opd.push(eval(key1,key2,'A'));
}
op.pop();
}
op.push('O');
p += 2;
}
else if(e_litera(s[p]) && !e_litera(s[p+1])){
opd.push(val[s[p]-'A']);
++p;
}
else if(s[p] == ')'){
while(op.top() != '('){
if(op.top() == 'N'){
int key = opd.top();
opd.pop();
opd.push(eval(key,0,'N'));
}
else{
int key1 = opd.top();
opd.pop();
int key2 = opd.top();
opd.pop();
opd.push(eval(key1,key2,op.top()));
}
op.pop();
}
op.pop();
++p;
}
else if(s[p] == 'T' && s[p+1] == 'R'){
opd.push(1);
p += 4;
}
else if(s[p] == 'F' && s[p+1] == 'A'){
opd.push(0);
p += 5;
}
}
return opd.top();
}
int main()
{
in.getline(s + 1,NMAX);
n = lungime(s);
s[n + 1] = ')';
++n;
in>>q;
char what;
for(int i = 1 ; i <= q ; i++){
in>>what;
val[what-'A'] = 1 - val[what - 'A'];
init();
out<<solve();
}
return 0;
}