Pagini recente » Cod sursa (job #2764320) | Cod sursa (job #2235893) | Cod sursa (job #2725331) | Cod sursa (job #85819) | Cod sursa (job #915856)
Cod sursa(job #915856)
#include<stdio.h>
#include<string.h>
int prior[256],n,l,uNr,uOp;
char s[1001],stNr[1000],stOp[1000],*p,val[256];
void citire()
{
freopen("bool.in","r",stdin);
gets(s);
}
void inlocuire(char op[],char ch)
{
int l=strlen(op);
p=strstr(s,op);
while(p!=NULL)
{
strcpy(p,p+l-1);
s[p-s]=ch;
p=strstr(s,op);
}
}
void preproc()
{
inlocuire("AND",'&');
inlocuire("OR",'|');
inlocuire("NOT",'~');
inlocuire("TRUE",'1');
inlocuire("FALSE",'0');
prior['~']=3;
prior['&']=2;
prior['|']=1;
l=strlen(s);
}
char solve(char x,char y,char op)
{
switch(op)
{
case '&': return x&y;
case '|': return x|y;
}
}
char evalueaza()
{
uNr=0;
uOp=0;
for(int i=l-1;i>=0;i--)
{
if(s[i]=='0' || s[i]=='1')
{
stNr[++uNr]=s[i]-'0';
continue;
}
if(s[i]<='Z' && s[i]>='A')
{
stNr[++uNr]=val[s[i]];
continue;
}
if(s[i]=='(')
{
while(stOp[uOp]!=')')
{
stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
uNr--;
uOp--;
}
uOp--;
continue;
}
if(s[i]=='~')
{
stNr[uNr]=1-stNr[uNr];
continue;
}
if(s[i]=='|' || s[i]=='&')
{
while(prior[stOp[uOp]]>prior[s[i]] && uOp>0)
{
stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
uNr--;
uOp--;
}
uOp++;
stOp[uOp]=s[i];
continue;
}
if(s[i]==')')
{
stOp[++uOp]=')';
}
}
while(uOp>0 && uNr>1)
{
stNr[uNr-1]=solve(stNr[uNr-1],stNr[uNr],stOp[uOp]);
uNr--;
uOp--;
}
return stNr[1];
}
void rezolva()
{
char ch;
freopen("bool.out","w",stdout);
scanf("%d\n",&n);
for(int i=1;i<=n;i++)
{
scanf("%c",&ch);
val[ch]=1-val[ch];
printf("%d",evalueaza());
}
}
int main()
{
citire();
preproc();
rezolva();
return 0;
}