Pagini recente » Cod sursa (job #146657) | Cod sursa (job #2477995) | Cod sursa (job #253139) | Cod sursa (job #1952219) | Cod sursa (job #2511439)
#include <iostream>
#include <fstream>
#include <stack>
#include <queue>
#define NMAX 100001
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
class ExpresionEvaluator
{
private:
const int INF=1e9;
int res;
stack <char> s;
queue <char> q;
int priorities[255]={0},var[26]={0};
int getRes(int x,int y,char op)
{
if(x=='1')
x=1;
else if(x=='0')
x=0;
else
x=var[x-'A'];
if(y=='1')
y=1;
else if(y=='0')
y=0;
else
y=var[y-'A'];
switch(op)
{
case '|':
return (x || y);
case '&':
return (x && y);
case '~':
return (!x);
}
}
bool isVar(char c)
{
return (c<='Z' && c>='A' || c=='1' || c=='0');
}
void buildPostfix(char *v)
{
char *p=v;
while(*p!='\0')
{
if(isVar(*p))
q.push(*p);
else
{
if(*p=='(')
s.push(*p);
else if(*p==')')
{
while(s.top()!='(')
{
q.push(s.top());
s.pop();
}
s.pop();
}
else
{
while(!s.empty() && priorities[s.top()]>=priorities[*p])
{
q.push(s.top());
s.pop();
}
s.push(*p);
}
}
++p;
}
while(!s.empty())
{
q.push(s.top());
s.pop();
}
}
public:
void updateValue(char c)
{
var[c-'A']=~var[c-'A'];
res=INF;
}
int evaluate()
{
if(res!=INF)
return res;
queue <char> temp=q;
while(!q.empty())
{
if(isVar(q.front()))
s.push(q.front());
else if(q.front()=='~')
{
int x=s.top();
s.pop();
s.push(getRes(x,'0',q.front())+'0');
}
else
{
int y=s.top();
s.pop();
int x=s.top();
s.pop();
s.push(getRes(x,y,q.front())+'0');
}
q.pop();
}
res=s.top()-'0';
s.pop();
q=temp;
return res;
}
void printPostfix()
{
queue <char>e=q;
while(!e.empty())
{
cout<<e.front()<<' ';
e.pop();
}
cout<<'\n';
}
ExpresionEvaluator(char *v)
{
res=INF;
priorities['|']=1;
priorities['&']=2;
priorities['~']=3;
buildPostfix(v);
}
};
int main()
{
char v[NMAX];
f.get(v,NMAX);
char s[NMAX];
int k=0;
for(int i=0;v[i]!='\0';i++)
{
if(v[i]=='(')
s[k++]=v[i];
else if(v[i]==')')
s[k++]=v[i];
else if(v[i+1]==' ' || v[i+1]=='\0' || v[i+1]==')')
s[k++]=v[i];
else
{
if(v[i]=='A')
s[k++]='&',i+=2;
else if(v[i]=='O')
s[k++]='|',++i;
else if(v[i]=='N')
s[k++]='~',i+=2;
else if(v[i]=='F')
s[k++]='0',i+=4;
else if(v[i]=='T')
s[k++]='1',i+=3;
}
}
s[k]='\0';
ExpresionEvaluator exp(s);
exp.printPostfix();
int n;
f>>n;
while(n--)
{
char c;
f>>c;
exp.updateValue(c);
g<<exp.evaluate();
}
return 0;
}