Pagini recente » Cod sursa (job #2974419) | Cod sursa (job #2913230) | Cod sursa (job #2689763) | Cod sursa (job #550567) | Cod sursa (job #1166410)
#include <fstream>
#include <vector>
#define MAXC 1005
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
struct nod{
bool val;
char var,op;
nod *fiu[2];
nod(){
val=0;
var='0';
op='0';
fiu[0]=fiu[1]=NULL;}};
nod *rad;
int n,priority[300];
char s[MAXC],*p,c;
vector<nod *> stivavar;
vector<char> stivaop;
void build_expression_tree();
bool eval(nod *a);
int main()
{
int i;
f.getline(s+1,MAXC,'\n');
p=s+1;
build_expression_tree();
f>>n;
f.getline(s+1,MAXC,'\n');
f.getline(s+1,MAXC,'\n');
for(i=1;i<=n;i++){
c=s[i];
g<<eval(rad);}
f.close();
g.close();
return 0;
}
void build_expression_tree(){
nod *a;
priority[(int)('!')]=3;priority[(int)('&')]=2;priority[(int)('|')]=1;
while(*p!='\0'){
if(*p==' '){
p++;
continue;}
if(*p=='('){
stivaop.push_back('(');
p++;
continue;}
if(*p>='A'&&*p<='Z'&&(*(p+1)<'A'||*(p+1)>'Z')){
a=new nod;
a->var=(*p);
stivavar.push_back(a);
p++;
continue;}
if(*p==')'){
while(stivaop.back()!='('){
a=new nod;
a->op=stivaop.back();
stivaop.pop_back();
if(a->op=='!'){
a->fiu[0]=stivavar.back();
stivavar.pop_back();
stivavar.push_back(a);
continue;}
a->fiu[1]=stivavar.back();stivavar.pop_back();
a->fiu[0]=stivavar.back();stivavar.pop_back();
stivavar.push_back(a);}
stivaop.pop_back();
p++;
continue;}
if(*p=='T'){
a=new nod;
a->val=1;
stivavar.push_back(a);
p+=4;
continue;}
if(*p=='F'){
a=new nod;
p+=5;
stivavar.push_back(a);
continue;}
if(*p=='N'){
stivaop.push_back('!');
p+=3;
continue;}
if(*p=='O'){
c='|';
p+=2;}
else{
c='&';
p+=3;}
while(!stivaop.empty()&&priority[(int)(stivaop.back())]>=priority[(int)(c)]){
a=new nod;
a->op=stivaop.back();
stivaop.pop_back();
if(a->op=='!'){
a->fiu[0]=stivavar.back();
stivavar.pop_back();
stivavar.push_back(a);
continue;}
a->fiu[1]=stivavar.back();stivavar.pop_back();
a->fiu[0]=stivavar.back();stivavar.pop_back();
stivavar.push_back(a);}
stivaop.push_back(c);}
while(!stivaop.empty()){
a=new nod;
a->op=stivaop.back();
stivaop.pop_back();
if(a->op=='!'){
a->fiu[0]=stivavar.back();
stivavar.pop_back();
stivavar.push_back(a);
continue;}
a->fiu[1]=stivavar.back();stivavar.pop_back();
a->fiu[0]=stivavar.back();stivavar.pop_back();
stivavar.push_back(a);}
rad=stivavar[0];}
bool eval(nod *a){
if(a->fiu[0]==NULL&a->fiu[1]==NULL){
if(a->var==c)
a->val=(!(a->val));}
else{
if(a->fiu[1]==NULL)
a->val=!(eval(a->fiu[0]));
else{
if(a->op=='|')
a->val=(eval(a->fiu[0]))|(eval(a->fiu[1]));
else
a->val=(eval(a->fiu[0]))&(eval(a->fiu[1]));}}
return a->val;}