Pagini recente » Cod sursa (job #551250) | Cod sursa (job #2442143) | Cod sursa (job #195264) | Cod sursa (job #2798504) | Cod sursa (job #2223829)
//#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int V[105];
int f(char O[], int cnt)
{
int S[1005], cnts = 0;
for (int i = 0; i < cnt; ++ i) {
if (('A' <= O[i]) and (O[i] <= 'Z'))
S[cnts ++] = V[O[i]];
else if ((O[i] == '0') or (O[i] == '1'))
S[cnts ++] = O[i] - '0';
else if (O[i] == '!')
S[cnts - 1] ^= 1;
else if (O[i] == '&')
S[cnts - 2] = S[cnts - 2] & S[cnts - 1], cnts --;
else if (O[i] == '|')
S[cnts - 2] = S[cnts - 2] | S[cnts - 1], cnts --;
}
return S[0];
}
int main(void)
{
char E[1005], S[1005], O[1005], ch;
int n;
int cnts, cnto, i, len;
ifstream cin("bool.in");
ofstream cout("bool.out");
cin.getline(E, 1005);
len = int(strlen(E));
for (cnts = cnto = i = 0; i < len; ++ i) {
if (E[i] == ' ')
continue ;
else if (E[i] == '(')
S[cnts ++] = '(';
else if (E[i] == ')') {
while (S[cnts - 1] != '(')
O[cnto ++] = S[-- cnts];
cnts --;
} else if (E[i] == 'O') {
if (strncmp(&E[i], "OR", 2) == 0) {
while ((cnts > 0) and ((S[cnts - 1] == '&') or (S[cnts - 1] == '!')))
O[cnto ++] = S[-- cnts];
S[cnts ++] = '|', i += 1;
} else
O[cnto ++] = E[i];
} else if (E[i] == 'A') {
if (strncmp(&E[i], "AND", 3) == 0) {
while ((cnts > 0) and (S[cnts - 1] == '!'))
O[cnto ++] = S[-- cnts];
S[cnts ++] = '&', i += 2;
} else
O[cnto ++] = E[i];
} else if (E[i] == 'N') {
if (strncmp(&E[i], "NOT", 3) == 0)
S[cnts ++] = '!', i += 2;
else
O[cnto ++] = E[i];
} else if (E[i] == 'T') {
if (strncmp(&E[i], "TRUE", 4) == 0)
O[cnto ++] = '1', i += 3;
else
O[cnto ++] = E[i];
} else if (E[i] == 'F') {
if (strncmp(&E[i], "FALSE", 5) == 0)
O[cnto ++] = '0', i += 4;
else
O[cnto ++] = E[i];
} else
O[cnto ++] = E[i];
}
while (cnts > 0)
O[cnto ++] = S[-- cnts];
for (cin >> n; n > 0; -- n)
cin >> ch, V[ch] ^= 1, cout << f(O, cnto);
return 0;
}