Pagini recente » Cod sursa (job #1506991) | Cod sursa (job #1428651) | Cod sursa (job #448760) | Cod sursa (job #873913) | Cod sursa (job #688828)
Cod sursa(job #688828)
#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(CH(EXP[i]));
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;
}
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;
}