Cod sursa(job #791743)
#include <fstream>
#include <string>
using namespace std;
ifstream fin("bool.in");
ofstream fout("bool.out");
string s;
const int MAX_N = 1001;
bool val[27];
char qu[MAX_N];
int qu_back = 0;
char st[MAX_N];
int st_top = 0;
bool evSt[MAX_N];
int evSt_top = 0;
int N;
void shunting_yard();
char is_operator(int &pos);
int op(char ch);
bool rsy();
int main(int argc, char const *argv[])
{
getline(fin, s);
shunting_yard();
fin >> N;
fin.ignore();
char c;
for (int i = 0; i < N; ++i) {
fin.get(c);
val[c - 'A'] = !val[c - 'A'];
fout << rsy();
}
return 0;
}
void shunting_yard() {
char ch;
for (int i = 0; i < s.size(); ++i) {
if (ch = is_operator(i)) {
if (ch == '0' || ch == '1') {
qu[++qu_back] = ch;
} else {
while (st_top > 0 && op(ch) <= op(st[st_top])) {
qu[++qu_back] = st[st_top];
--st_top;
}
st[++st_top] = ch;
}
} else if (isalpha(s[i])) {
qu[++qu_back] = s[i];
} else if (s[i] == '(') {
st[++st_top] = s[i];
} else if (s[i] == ')') {
while (st_top > 0 && st[st_top] != '(') {
qu[++qu_back] = st[st_top];
--st_top;
}
--st_top;
}
}
while (st_top > 0) {
qu[++qu_back] = st[st_top];
--st_top;
}
}
bool rsy() {
bool result;
evSt_top = 0;
for (int i = 1; i <= qu_back; ++i) {
if (isalpha(qu[i])) {
evSt[++evSt_top] = val[qu[i] - 'A'];
} else if (qu[i] == '1') {
evSt[++evSt_top] = true;
} else if (qu[i] == '0') {
evSt[++evSt_top] = false;
} else if (qu[i] == '~') {
evSt[evSt_top] = !evSt[evSt_top];
} else if (qu[i] == '&') {
evSt[evSt_top - 1] = evSt[evSt_top - 1] && evSt[evSt_top];
--evSt_top;
} else if (qu[i] == '|') {
evSt[evSt_top - 1] = evSt[evSt_top - 1] || evSt[evSt_top];
--evSt_top;
}
}
result = evSt[evSt_top];
--evSt_top;
return result;
}
char is_operator(int &pos) {
if (s.substr(pos, 3) == "NOT") {
pos += 2;
return '~';
} else if (s.substr(pos, 3) == "AND") {
pos += 2;
return '&';
} else if (s.substr(pos, 2) == "OR") {
pos += 1;
return '|';
} else if (s.substr(pos, 4) == "TRUE") {
pos += 3;
return '1';
} else if (s.substr(pos, 5) == "FALSE") {
pos += 4;
return '0';
} else {
return 0;
}
}
int op(char ch) {
if (ch == '~') {
return 4;
} else if (ch == '&') {
return 3;
} else if (ch == '|') {
return 2;
} else {
return 0;
}
}