Pagini recente » Cod sursa (job #1259257) | Cod sursa (job #2513358) | Cod sursa (job #656501) | Cod sursa (job #1155635) | Cod sursa (job #2672567)
#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 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();
}
}
evaluare();
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();
}
}