Pagini recente » Cod sursa (job #59379) | Cod sursa (job #2136624) | Cod sursa (job #1408315) | Cod sursa (job #639214) | Cod sursa (job #1990002)
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <ctype.h>
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;
cin.ignore();
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) {
word += ch;
cout<<word<<"\n";
if(word == "N" && ch == 'O')
a[++length] = '!' ,word = "" ,sin>>ch ;
else if(word == "A" && ch == 'N')
a[++length] = '&' ,word = "" ,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 ;
else if(word == "F" && ch == 'A')
a[++length] = '<', word ="" ,sin>>ch ,sin>>ch ,sin>>ch;
else if(word != "")
a[++length] = word ,word = "";
}*/
for(int i = 0 ; i < line.size() ; ++i) {
if(line[i] == 'N' && line[i+1] == 'O') {
word = "!";
a[++length] = word;
i+=2;
}
else if(line[i] == 'O' && line[i+1] == 'R') {
word = "|";
a[++length] = word;
i+=1;
}
else if(line[i] == 'A' && line[i+1] == 'N') {
word = "&";
a[++length] = word;
i+=2;
}
else if(line[i] == 'T' && line[i+1] == 'R') {
word = ">";
a[++length] = word;
i+=3;
}
else if(line[i] == 'F' && line[i+1] == 'A') {
word = "<";
a[++length] = word;
i+=4;
}
else if('(' <= line[i] && line[i+1] <= 'Z') {
word = line[i];
a[++length] = word;
i+=1;
}
}
}