Pagini recente » Cod sursa (job #2549372) | Cod sursa (job #797771) | Cod sursa (job #1273198) | Cod sursa (job #2448589) | Cod sursa (job #2815693)
// Bool.cpp : This file contains the 'main' function. Program execution begins and ends there.
// infoarena
/**
* Algoritmul lui Dijkstra cu doua stive, forma poloneza postfixata
* a unei expresii logice
*/
#include <iostream>
#include <fstream>
#include <cctype>
#include <cstring>
#include <stack>
#define DIM 6006
#define MAXC 100
#pragma warning(disable: 4996)
std::ifstream fin("bool.in");
std::ofstream fout("bool.out");
using namespace std;
int N;
char s[DIM];
bool adevar[MAXC];
stack<char> op;
stack<bool> nr;
bool eval(bool x, bool y, char semn)
{
if (semn == '&') return x & y;
if (semn == '|') return x | y;
}
bool prioritate(char s1, char s2)
{
if (s1 == '(')
return true;
if (s1 == '|' && s2 == '&')
return true;
return false;
}
void dijkstra()
{
char sep[] = " ";
char* p = strtok(s, sep);
while (p != NULL)
{
// Paranteze
if (!strcmp(p, "("))
op.push('(');
else if (!strcmp(p, ")"))
{
while (op.top() != '(')
{
bool v2 = nr.top();
nr.pop();
bool v1 = nr.top();
nr.pop();
char semn = op.top();
op.pop();
nr.push(eval(v1, v2, semn));
}
op.pop();
}
// Operatori
else if (!strcmp(p, "AND") || !strcmp(p, "OR"))
{
char Operator;
if (!strcmp(p, "AND"))
Operator = '&';
else
Operator = '|';
if (op.empty() || prioritate(op.top(), Operator))
op.push(Operator);
else
{
do
{
bool v2 = nr.top();
nr.pop();
bool v1 = nr.top();
nr.pop();
char semn = op.top();
op.pop();
nr.push(eval(v1, v2, semn));
} while (!op.empty() && !prioritate(op.top(), Operator));
}
}
// Operanzi
else
{
// Constante
if (!strcmp(p, "TRUE") || !strcmp(p, "FALSE"))
{
if (!strcmp(p, "TRUE"))
nr.push(true);
else
nr.push(false);
}
// Variabile
else
{
// Verificam daca exista negatie
if (!strcmp(p, "NOT"))
{
p = strtok(NULL, sep);
char var = p[0];
nr.push(adevar[var - 'A'] ^ 1);
}
else
{
char var = p[0];
nr.push(adevar[var - 'A']);
}
}
}
p = strtok(NULL, sep);
}
while (!op.empty())
{
bool v2 = nr.top();
nr.pop();
bool v1 = nr.top();
nr.pop();
char semn = op.top();
op.pop();
nr.push(eval(v1, v2, semn));
}
fout << nr.top();
}
static inline void Read()
{
char h[DIM];
int k = 0;
fin.getline(h, DIM);
for (int i = 0; h[i] != '\0'; i++)
if (h[i] == '(')
s[k] = h[i], s[k + 1] = ' ', k += 2;
else if (h[i] == ')')
s[k] = ' ', s[k + 1] = h[i], k += 2;
else
s[k++] = h[i];
}
static inline void Solve()
{
fin >> N;
for (int i = 0; i < MAXC; i++)
adevar[i] = false;
for (char var; N; N--)
{
fin >> var;
adevar[var - 'A'] = adevar[var - 'A'] ^ 1; // x^1 == !x
dijkstra();
}
}
int main()
{
Read();
Solve();
return 0;
}