Cod sursa(job #688860)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 23 februarie 2012 21:55:04
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <fstream>
#include <stack>
#include <vector>
#define NMAx 1100
#define CH(x) (x-'A')
#define pb push_back
#define isAlpha(x) ('A'<=x&&x<='Z')
#define isDigit(x) ('0'<=x&&x<='9')
using namespace std;

vector <char> EXP;
stack <char> ST;
stack <bool> Stk;
char C,S[NMAx],priority[]="!&|()";
int Q,sol;
bool vars[NMAx];

void evaluare() {
	
	int i;
	bool A,B;
	
	for(i=0;i<EXP.size();i++) {
		
		if(isDigit(EXP[i]))
			Stk.push((EXP[i]-'0'));
		else
		if(isAlpha(EXP[i]))
			Stk.push(vars[CH(EXP[i])]);
		else {
			A=Stk.top();Stk.pop();
			switch(EXP[i]) {
				case '!':Stk.push(!A);break;
				case '&':B=Stk.top();Stk.pop();Stk.push(A&B);break;
				case '|':B=Stk.top();Stk.pop();Stk.push(A|B);break;
				}
			}
		}
	
	sol=Stk.top();
	Stk.pop();
	
}
bool cmp(char a,char b) {
	
	for(int i=0;i<5;i++)
		if(priority[i]==a)
			return 0;
		else
		if(priority[i]==b)
			return 1;
	return 0;
	
}
char transform(int &i) {
	
	if(S[i]=='A'&&S[i+1]=='N') {
		i+=2;
		return '&';
		}
	else
	if(S[i]=='N'&&S[i+1]=='O') {
		i+=2;
		return '!';
		}
	else
	if(S[i]=='O'&&S[i+1]=='R') {
		i++;
		return '|';
		}
	else
	if(S[i]=='T'&&S[i+1]=='R') {
		i+=3;
		return '1';
		}
	else
	if(S[i]=='F'&&S[i+1]=='A') {
		i+=4;
		return '0';
		}
	else
		return S[i];

}
void forma_poloneza() {
	
	int i=-1;
	
	for(i=0;S[i];i++) {
		
		if(S[i]==' ')
			continue;
		
		C=transform(i);
		
		if(isAlpha(C)||isDigit(C))
			EXP.pb(C);
		else
		if(C=='(')
			ST.push(C);
		else
		if(C==')') {
			while(!ST.empty()&&ST.top()!='(') {
				EXP.pb(ST.top());
				ST.pop();
				}
			ST.pop();
			}
		else {
			while(!ST.empty()&&cmp(C,ST.top())) {//<=
				EXP.pb(ST.top());
				ST.pop();
				}
			ST.push(C);
			}
		
		}
	
	while(!ST.empty()) {
		EXP.pb(ST.top());
		ST.pop();
		}
	
}
int main() {
	
	int i;
	ifstream in("bool.in");
	ofstream out("bool.out");
	in.getline(S,NMAx);
	in>>Q;
	
	forma_poloneza();
	
	for(i=0;i<Q;i++) {
		in>>C;
		vars[CH(C)]=!vars[CH(C)];
		evaluare();
		out<<sol;
		}
	
	out<<'\n';
	
	in.close();
	out.close();
	
	return 0;
	
}