Pagini recente » Cod sursa (job #202082) | Cod sursa (job #2258766) | Cod sursa (job #2073143) | Cod sursa (job #2077043) | Cod sursa (job #1989989)
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
string line, a[3000];
int k = 0, o = 0, n, stackAlpha[3000], stackOp[3000];
int priority[3000];
bool alf[30];
int length;
void Read();
void Solve();
int Calculator(int a, int b, int c);
int main()
{
ifstream cin("bool.in");
ofstream cout("bool.out");
getline(cin,line);
Read();
cin>>n;
for(int i = 1 ; i <= n ; ++i) {
char ch;
cin>>ch;
alf[ch - 'A'] = !alf[ch - 'A'];
Solve();
cout<<stackAlpha[k];
}
return 0;
}
void Solve() {
priority['|'] = 1;
priority['&'] = 2;
priority['!'] = 3;
priority['('] = 4;
int i = 1, x = 0;
k = 0, o = 0;
while(i <= length + 1) {
char ch = a[i][0];
if('A' <= ch && ch <= 'Z') {
stackAlpha[++k] = alf[ch - 'A'];
}
else if(ch == '>')
stackAlpha[++k] = 1;
else if(ch == '<')
stackAlpha[++k] = 0;
else if(ch == ')') {
while(stackOp[o] != '(') {
stackAlpha[++k] = stackOp[o--];
if(stackAlpha[k] != '!')
x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
else
x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
stackAlpha[k] = x;
}
--o;
}
else {
while(o > 0 && k > 0 && stackOp[o] != '(' && priority[stackOp[o]] >= priority[ch]) {
stackAlpha[++k] = stackOp[o--];
if(stackAlpha[k] != '!')
x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
else
x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
stackAlpha[k] = x;
}
stackOp[++o] = ch;
}
++i;
}
}
int Calculator(int a, int b, int c) {
switch (c) {
case '!': return !a;
case '&': return a & b;
case '|': return a | b;
}
}
void Read() {
stringstream sin(line);
char ch;
string word = "";
while(sin>>ch) {
if(word == "N" && ch == 'O')
a[++length] = '!' ,word = "" ,sin>>ch ,sin>>ch;
else if(word == "A" && ch == 'N')
a[++length] = '&' ,word = "" ,sin>>ch ,sin>>ch;
else if(word == "O" && ch == 'R')
a[++length] = '|' ,word = "" ,sin>>ch;
else if(word == "T" && ch == 'R')
a[++length] = '>', word ="" ,sin>>ch ,sin>>ch ,sin>>ch;
else if(word == "F" && ch == 'A')
a[++length] = '<', word ="" ,sin>>ch ,sin>>ch ,sin>>ch ,sin>>ch;
else if(word != "")
a[++length] = word ,word = "";
word += ch;
}
a[++length] = word;
}