Pagini recente » Cod sursa (job #729524) | Cod sursa (job #362143) | Cod sursa (job #1383193) | Cod sursa (job #1756204) | Cod sursa (job #884458)
Cod sursa(job #884458)
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
char buffer[1005];
int len,id,n,i;
char crt;
bool val[30];
stack <bool> values;
stack <char> operators;
bool evariabila(int p) {
return ('A' <= buffer[p] && buffer[p] <= 'Z' && (buffer[p+1] < 'A' || buffer[p+1] > 'Z'));
}
bool econstanta(int p) {
bool econst = false;
if (buffer[p] == 'T' && buffer[p+1] == 'R' && buffer[p+2] == 'U' && buffer[p+3] == 'E') econst = true;
if (buffer[p] == 'F' && buffer[p+1] == 'A' && buffer[p+2] == 'L' && buffer[p+3] == 'S' && buffer[p+4] == 'E') econst = true;
return econst;
}
bool eparanteza(int p) {
return (buffer[p] == '(' || buffer[p] == ')');
}
bool eoperator(int p) {
bool eop = false;
if (buffer[p] == 'A' && buffer[p+1] == 'N' && buffer[p+2] == 'D') eop = true;
if (buffer[p] == 'O' && buffer[p+1] == 'R') eop = true;
if (buffer[p] == 'N' && buffer[p+1] == 'O' && buffer[p+2] == 'T') eop = true;
return eop;
}
void domath() {
bool a,b;
if (operators.top() == 'A') { /** AND */
a = values.top(); values.pop();
b = values.top(); values.pop();
values.push(a && b); operators.pop();
} else if (operators.top() == 'O') { /** OR */
a = values.top(); values.pop();
b = values.top(); values.pop();
values.push(a || b); operators.pop();
} else if (operators.top() == 'N') { /** NOT */
a = values.top(); values.pop();
values.push(!a);
}
}
int main() {
freopen("bool.in","r",stdin);
freopen("bool.out","w",stdout);
fgets(buffer,1004,stdin);
for (i=0;i<=29;i++) val[i] = true;
len = strlen(buffer);
scanf("%d",&n);
for (int t=1;t<=n;t++) {
scanf("%c",&crt);
val[crt-'A'] = !val[crt-'A'];
for (i=0;i<len-1;i++) {
crt = buffer[i];
if (evariabila(i)) {
if (! operators.empty() && operators.top() == 'N') {
values.push(!val[crt-'A']);
operators.pop();
} else values.push(val[crt-'A']);
} else if (econstanta(i)) {
if (crt == 'T') values.push(true);
else values.push(false);
while ('A' <= buffer[i+1] && buffer[i+1] <= 'Z') i++;
} else if (eparanteza(i)) {
if (crt == '(') operators.push('(');
else {
while (operators.top() != '(') domath();
operators.pop();
}
} else if (eoperator(i)) {
if (crt == 'A') {
while (operators.size() > 1 && (operators.top() != '(' || operators.top() == 'N')) domath();
operators.push(crt);
} else if (crt == 'O') {
while (operators.size() > 1 && (operators.top() != '(' || operators.top() == 'A' || operators.top() == 'N')) domath();
operators.push(crt);
} else if (crt == 'N') {
operators.push(crt);
}
while ('A' <= buffer[i+1] && buffer[i+1] <= 'Z') i++;
}
}
while (values.size() > 1) domath();
if (values.top()) printf("1");
else printf("0");
values.pop();
}
return 0;
}