Pagini recente » Cod sursa (job #2443516) | Cod sursa (job #713614) | Cod sursa (job #1281956) | Cod sursa (job #2035244) | Cod sursa (job #94736)
Cod sursa(job #94736)
#include <iostream>
#include <fstream>
#include <stack>
#include <string>
using namespace std;
bool chars[30];
stack<string> operatori;
string poloneza[1001];
int pozitie;
void transform(string expresie)
{
while(expresie.length() > 0)
{
if(expresie.at(0) == ' ')
expresie.erase(0,1);
if(expresie.at(0) == '(')
{
operatori.push("(");
expresie.erase(0,1);
continue;
}
if(expresie.at(0) == ')')
{
while(!operatori.empty())
{
string o = operatori.top();
operatori.pop();
if(o.compare("(") == 0)
break;
poloneza[pozitie++].assign(o);
}
expresie.erase(0,1);
continue;
}
int poz1 = expresie.find_first_of(" ");
int poz2 = expresie.find_first_of(")");
string s1;
if(poz1 > 0 && poz2 > 0)
{
int min = poz1;
if(poz2<poz1)
min = poz2;
s1 = expresie.substr(0, min);
expresie = expresie.substr(min);
}
else
{
if(poz1 > 0)
{
s1 = expresie.substr(0, poz1);
expresie = expresie.substr(poz1);
}
else
{
if(poz2 > 0)
{
s1 = expresie.substr(0, poz2);
expresie = expresie.substr(poz2);
}
else
{
s1 = expresie;
expresie = "";
}
}
}
if(s1.length() == 1)
poloneza[pozitie++].assign(s1);
if(s1.compare("TRUE") == 0)
poloneza[pozitie++].assign("TRUE");
if(s1.compare("FALSE") == 0)
poloneza[pozitie++].assign("FALSE");
if(s1.compare("NOT") == 0)
{
operatori.push("NOT");
}
if(s1.compare("AND") == 0)
{
while(!operatori.empty())
{
string o = operatori.top();
if(o.compare("NOT") == 0 )
{
operatori.pop();
poloneza[pozitie++].assign(o);
continue;
}
break;
}
operatori.push("AND");
}
if(s1.compare("OR") == 0)
{
while(!operatori.empty())
{
string o = operatori.top();
if(o.compare("OR") == 0 || o.compare("(") == 0)
{
break;
}
operatori.pop();
poloneza[pozitie++].assign(o);
break;
}
operatori.push("OR");
}
}
while(!operatori.empty())
{
poloneza[pozitie++].assign(operatori.top());
operatori.pop();
}
}
int main(void)
{
ifstream in;
ofstream out;
in.open("bool.in");
out.open("bool.out");
string expresie;
char read[1001];
in.getline(read, 1001);
expresie.assign(read);
transform(expresie);
for(int i=0;i<30;++i)
chars[i] = false;
int n;
in >> n;
for(int i=0;i<n;++i)
{
char ch;
in >> ch;
stack<bool> value;
chars[ch-'A'] = !chars[ch-'A'];
for(int k=0;k<pozitie;++k)
{
if(poloneza[k].length() == 1)
value.push(chars[poloneza[k].at(0) - 'A']);
if(poloneza[k].compare("TRUE") == 0)
value.push(true);
if(poloneza[k].compare("FALSE") == 0)
value.push(false);
if(poloneza[k].compare("NOT") == 0)
{
bool b = value.top();
value.pop();
value.push(!b);
}
if(poloneza[k].compare("AND") == 0)
{
bool b = value.top();
value.pop();
bool a = value.top();
value.pop();
value.push(a && b);
}
if(poloneza[k].compare("OR") == 0)
{
bool b = value.top();
value.pop();
bool a = value.top();
value.pop();
value.push(a || b);
}
}
bool r = value.top();
value.pop();
if(r)
out << "1";
else
out << "0";
}
out << "\n";
in.close();
out.close();
return 0;
}