Pagini recente » Cod sursa (job #1278274) | Cod sursa (job #2487646) | Cod sursa (job #1560941) | Cod sursa (job #2459953) | Cod sursa (job #94741)
Cod sursa(job #94741)
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#include <string>
using namespace std;
bool chars[30];
stack<string> operatori;
vector<string> poloneza;
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.push_back(o);
}
expresie.erase(0,1);
continue;
}
size_t poz1 = expresie.find_first_of(" ");
size_t poz2 = expresie.find_first_of(")");
string s1;
if(poz1 > 0 && poz2 > 0)
{
size_t 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.push_back(s1);
if(s1.compare("TRUE") == 0)
poloneza.push_back("TRUE");
if(s1.compare("FALSE") == 0)
poloneza.push_back("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.push_back(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.push_back(o);
break;
}
operatori.push("OR");
}
}
while(!operatori.empty())
{
poloneza.push_back(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<string> value;
chars[ch-'A'] = !chars[ch-'A'];
for(size_t k=0;k<poloneza.size();++k)
{
if(poloneza.at(k).length() == 1)
value.push(chars[poloneza[k].at(0) - 'A']?"TRUE":"FALSE");
if(poloneza.at(k).compare("TRUE") == 0)
value.push("TRUE");
if(poloneza.at(k).compare("FALSE") == 0)
value.push("FALSE");
if(poloneza.at(k).compare("NOT") == 0)
{
string b = value.top();
value.pop();
if(b.compare("TRUE") == 0)
value.push("FALSE");
else
value.push("TRUE");
}
if(poloneza.at(k).compare("AND") == 0)
{
string b = value.top();
value.pop();
string a = value.top();
value.pop();
if(a.compare("TRUE") == 0 && b.compare("TRUE") == 0)
value.push("TRUE");
else
value.push("FALSE");
}
if(poloneza.at(k).compare("OR") == 0)
{
string b = value.top();
value.pop();
string a = value.top();
value.pop();
if(a.compare("TRUE") == 0 || b.compare("TRUE") == 0)
value.push("TRUE");
else
value.push("FALSE");
}
}
string r = value.top();
value.pop();
if(r.compare("TRUE") == 0)
out << "1";
else
out << "0";
}
out << "\n";
in.close();
out.close();
return 0;
}