Cod sursa(job #94786)

Utilizator piroslPiros Lucian pirosl Data 25 octombrie 2007 12:42:15
Problema Bool Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.91 kb
#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.length() == 0)
			break;

		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);
			if(min < expresie.length())
				expresie = expresie.substr(min);
			else
				expresie = "";
		}
		else
		{
			if(poz1 > 0)
			{
				s1 = expresie.substr(0, poz1);
				if(poz1 < expresie.length())
					expresie = expresie.substr(poz1);
				else
					expresie = "";
			}
			else
			{
				if(poz2 > 0)
				{
					s1 = expresie.substr(0, poz2);
					if(poz2 < expresie.length())
						expresie = expresie.substr(poz2);
					else
						expresie = "";
				}
				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;
}