Pagini recente » Cod sursa (job #124211) | Cod sursa (job #2595678) | Cod sursa (job #1752469) | Cod sursa (job #2147292) | Cod sursa (job #1698086)
#include <cstdio>
#include <stack>
using namespace std;
char buffer[10000];
char varEx[1000];
bool val[256];
bool next(int bufpos, char* temp, int len)
{
for (int i = 0; i < len; i++)
{
if (buffer[bufpos + i] != temp[i])
return false;
}
return true;
}
int buildVarEx()
{
int len = 0, bufPos = 0;
varEx[len++] = '(';
while (buffer[bufPos] != 0)
{
if (next(bufPos, "(", 1))
{
varEx[len++] = '(';
bufPos += 1;
}
else if (next(bufPos, ")", 1))
{
varEx[len++] = ')';
bufPos++;
}
else if (next(bufPos, "AND", 3))
{
varEx[len++] = '&';
bufPos += 3;
}
else if (next(bufPos, "OR", 2))
{
varEx[len++] = '|';
bufPos += 2;
}
else if (next(bufPos, "NOT", 3))
{
varEx[len++] = '!';
bufPos += 3;
}
else if (next(bufPos, "TRUE", 4))
{
varEx[len++] = '1';
bufPos += 4;
}
else if (next(bufPos, "FALSE", 5))
{
varEx[len++] = '0';
bufPos += 5;
}
else if (next(bufPos, " ", 1))
{
bufPos++;
}
else if ('A' <= buffer[bufPos] && buffer[bufPos] <= 'Z')
{
varEx[len++] = buffer[bufPos++];
}
else
bufPos++;
}
varEx[len++] = ')';
return len;
}
bool eval(int len)
{
stack<char> operators;
stack<bool> values;
int pos = 0;
operators.push('X');
values.push('X');
while (pos < len)
{
if (varEx[pos] == '!' || varEx[pos] == '(' || varEx[pos] == '&')
{
operators.push(varEx[pos]);
}
else if (varEx[pos] == '|')
{
while (operators.top() == '&')
{
operators.pop();
bool val1 = values.top();
values.pop();
bool val2 = values.top();
values.pop();
values.push(val1 && val2);
}
while (operators.top() == '|')
{
operators.pop();
bool val1 = values.top();
values.pop();
bool val2 = values.top();
values.pop();
values.push(val1 || val2);
}
operators.push('|');
}
else if ('A' <= varEx[pos] && varEx[pos] <= 'Z')
{
values.push(val[varEx[pos]]);
while (operators.top() == '!')
{
bool v = values.top();
values.pop();
values.push(!v);
operators.pop();
}
}
else if ('0' <= varEx[pos] && varEx[pos] <= '1')
{
values.push(varEx[pos] == '1');
while (operators.top() == '!')
{
bool v = values.top();
values.pop();
values.push(!v);
operators.pop();
}
}
else if (varEx[pos] == ')')
{
while (operators.top() != '(')
{
while (operators.top() == '&')
{
operators.pop();
bool val1 = values.top();
values.pop();
bool val2 = values.top();
values.pop();
values.push(val1 && val2);
}
while (operators.top() == '|')
{
operators.pop();
bool val1 = values.top();
values.pop();
bool val2 = values.top();
values.pop();
values.push(val1 || val2);
}
}
operators.pop();
while (operators.top() == '!')
{
operators.pop();
bool v = values.top();
values.pop();
values.push(!v);
}
}
pos++;
}
return values.top();
}
int main()
{
freopen("bool.in", "r", stdin);
freopen("bool.out", "w", stdout);
fgets(buffer, 10000, stdin);
int len = buildVarEx();
int n, p = 0;
scanf("%d", &n);
while (n--)
{
char ct = 0;;
while (ct < 'A' || ct > 'Z')
scanf("%c", &ct);
val[ct] = !val[ct];
printf("%d", eval(len));
}
printf("\n");
return 0;
}