Pagini recente » Cod sursa (job #3205130) | Cod sursa (job #1382549) | Cod sursa (job #568719) | Cod sursa (job #2006488) | Cod sursa (job #2672565)
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream f ("bool.in");
ofstream g ("bool.out");
char sir[1001];
int n,lungime;
bool litere[30];
stack<bool> lit;
stack <char>operatori;
int putere(char semn)
{
if(semn == '!')
return 3;
if(semn == '&')
return 2;
if(semn == '|')
return 1;
return 0;
}
void evaluare() {
while (!operatori.empty() && operatori.top() != '(') {
bool nr1 = lit.top();
lit.pop();
char semn = operatori.top();
operatori.pop();
bool nr2;
if (semn != '!') {
nr2 = lit.top();
lit.pop();
}
switch (semn) {
case '!':
lit.push(!nr1);
break;
case '&':
lit.push(nr1 & nr2);
break;
case '|':
lit.push(nr1 | nr2);
break;
}
}
}
bool calc_dupa_semn(bool nr1,bool nr2,char semn)
{
if(semn == '&')
return nr1&nr2;
if(semn == '|')
return nr1|nr2;
if(semn == '!')
{
nr1 = !nr1;
semn = operatori.top();
operatori.pop();
return calc_dupa_semn(nr1,nr2,semn);
}
}
bool extrage_si_calculeaza()
{
char semn = operatori.top();
operatori.pop();
if(semn == '!')
{
bool nr1 = lit.top();
lit.pop();
return !nr1;
}
else
{
bool nr1 = lit.top();
lit.pop();
bool nr2 = lit.top();
lit.pop();
return calc_dupa_semn(nr1,nr2,semn);
}
}
bool eval_expr()
{
for(int i =0; i<lungime; i++)
{
if(sir[i] == ' ')
continue;
else if(sir[i] == '(')
{
operatori.push('(');
}
else if(sir[i] == 'T' && sir[i+1] == 'R')
{
lit.push(1);
i+=3;
}
else if(sir[i] == 'F' && sir[i+1] == 'A')
{
lit.push(0);
i+=3;
}
else if(sir[i] == 'N' && sir[i+1] == 'O')
{
// not are puterea cea mai mare deci niciodata nu va fi mai mic decat cei din fata
operatori.push('!');
i+=2;
}
else if(sir[i] == 'O' && sir[i+1] == 'R')
{
// or are puterea cea mai mica deci se va calcula mereu
evaluare();
operatori.push('|');
i++;
}
else if(sir[i] == 'A' && sir[i+1] == 'N')
{
// singura operatie cu putere mai mare este not deci se poate calcula and daca are not in fata in stackul de opearatori
if(!operatori.empty() && operatori.top() == 'N')
evaluare();
operatori.push('&');
i+=2;
}
else if(isalpha(sir[i]))
{
lit.push(litere[sir[i]-'A']);
}
else if(sir[i] == ')')
{
evaluare();
operatori.pop();
}
}
while(!operatori.empty())
{
lit.push(extrage_si_calculeaza());
}
g << lit.top();
while(!lit.empty())
lit.pop();
while(!operatori.empty())
operatori.pop();
}
int main()
{
f.getline(sir,1001);
lungime = strlen(sir);
f >> n;
for(int i = 1; i<=n; i++)
{
char litera;
f >> litera;
litere[litera-'A'] = !litere[litera-'A'];
eval_expr();
}
}