Pagini recente » Cod sursa (job #636595) | Cod sursa (job #2563995) | Cod sursa (job #262352) | Cod sursa (job #176393) | Cod sursa (job #2711280)
#include <iostream>
#include <fstream>
#include <stack>
#include <unordered_map>
#include <cstring>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
char expr[1001];
int l,n;
unordered_map<char,bool>Map;
stack<char>op;
stack<bool>nr;
void secventa()
{
while(!op.empty() && op.top() != '(')
{
bool a = nr.top();
nr.pop();
char semn = op.top();
op.pop();
bool b;
if(semn!='N')
{
b = nr.top();
nr.pop();
}
if(semn == 'A')
{
nr.push(a&b);
}
else if (semn=='O')
{
nr.push(a|b);
}
else if (semn == 'N')
{
nr.push(!a);
}
}
}
int eval()
{
for(int i = 0; i<l; i++)
{
if(expr[i] == '(')
{
op.push('(');
}
else if(expr[i] == ')')
{
secventa();
op.pop();
}
else if (expr[i] == 'N' && expr[i+1] != 'T')
{
op.push('N');
i+=2;
}
else if (expr[i] == 'A' && expr[i+1] == 'N')
{
if(!op.empty() && op.top() == 'N')
secventa();
op.push('A');
i+=2;
}
else if (expr[i] == 'O' && expr[i+1] == 'R')
{
secventa();
op.push('O');
i++;
}
else if (expr[i] == 'T' && expr[i+1] == 'R')
{
nr.push(1);
i+=3;
}
else if (expr[i] == 'F' && expr[i+1] == 'A')
{
nr.push(0);
i+=3;
}
else if (isalpha(expr[i]))
{
nr.push(Map[expr[i]]);
}
}
secventa();
}
int main()
{
f.getline(expr,1000);
l = strlen(expr);
f >> n;
for(int i = 0; i<n; i++)
{
char x;
f >> x;
Map[x] = !Map[x];
eval();
g << nr.top();
nr.pop();
}
}