Pagini recente » Istoria paginii runda/ms_x-xii/clasament | Cod sursa (job #2275690) | Cod sursa (job #1640842) | Cod sursa (job #2871191) | Cod sursa (job #1840673)
#include <fstream>
#include <stack>
#include <deque>
#include <cstring>
using namespace std;
ifstream f("bool.in");
ofstream g("bool.out");
struct expresion
{
short int n;//0=char,1=bool,2=operator
char c;
bool b;
short x;//0=left paranthesis,1=right paranthesis,2=OR,3=AND,4=NOT
};
struct node
{
expresion e;
node *st=NULL,*dr=NULL;
}*R=NULL;
bool values[26];
short l;
stack<short>stk;
deque<expresion>infix,postfix;
bool expressionValue(node*r)
{
if(r->e.n==0)
return values[r->e.c-'A'];
else if(r->e.n==1)
return r->e.b;
else
{
if(r->e.x==2)
return expressionValue(r->st)||expressionValue(r->dr);
else if(r->e.x==3)
return expressionValue(r->st)&&expressionValue(r->dr);
else return !expressionValue(r->st);
}
}
void printExpression(expresion e)
{
if(e.n==0)
g<<e.c<<" ";
else if(e.n==1)
g<<boolalpha<<e.b<<" ";
else g<<e.x<<" ";
g<<noboolalpha;
}
node* createNode()
{
node*r=new node;
if(postfix[l].n==2)
{
if(postfix[l].x==4)
{
r->e=postfix[l--];
r->st=createNode();
}
else
{
r->e=postfix[l--];
r->st=createNode();
r->dr=createNode();
}
}
else
{
r=new node;
r->e=postfix[l--];
}
return r;
}
void infixToPostfix()
{
short n=infix.size();
expresion aux;
aux.n=2;
stk.push(-1);
for(int i=0; i<n; i++)
{
if(infix[i].n==0||infix[i].n==1)
postfix.push_back(infix[i]);
else
{
if(infix[i].x==0)
stk.push(infix[i].x);
else
{
if(infix[i].x==1)
{
while(stk.top()!=0)
{
aux.x=stk.top();
postfix.push_back(aux);
stk.pop();
}
stk.pop();
}
else
{
if(stk.top()<infix[i].x)
stk.push(infix[i].x);
else
{
while(stk.top()>=infix[i].x)
{
aux.x=stk.top();
postfix.push_back(aux);;
stk.pop();
}
stk.push(infix[i].x);
}
}
}
}
}
while(stk.top()!=-1)
{
aux.x=stk.top();
postfix.push_back(aux);
stk.pop();
}
}
/*void srd(node*R)
{
if(R)
{
srd(R->st);
printExpresion(R->e);
srd(R->dr);
}
}*/
void readInfix()
{
short n;
char s[1003];
expresion aux;
f.getline(s,1001);
n=strlen(s);
for(int i=0; i<n; i++)
{
if(s[i]==' ')
continue;
if(s[i]=='(')
{
aux.n=2;
aux.x=0;
infix.push_back(aux);
}
else if(s[i]==')')
{
aux.n=2;
aux.x=1;
infix.push_back(aux);
}
else if(i+1==n)
{
aux.n=0;
aux.c=s[i];
infix.push_back(aux);
}
else if(s[i]>='A'&&s[i]<='Z'&&!(s[i+1]>='A'&&s[i+1]<='Z'))
{
aux.n=0;
aux.c=s[i];
infix.push_back(aux);
}
else
{
if(s[i]=='A'&&s[i+1]=='N'&&s[i+2]=='D')
{
aux.n=2;
aux.x=3;
infix.push_back(aux);
i+=2;
}
else if(s[i]=='O'&&s[i+1]=='R')
{
aux.n=2;
aux.x=2;
infix.push_back(aux);
i++;
}
else if(s[i]=='N'&&s[i+1]=='O'&&s[i+2]=='T')
{
if(!infix.empty())
{
if(infix.back().n==2&&infix.back().x==4)
infix.pop_back();
else
{
aux.n=2;
aux.x=4;
infix.push_back(aux);
}
}
else
{
aux.n=2;
aux.x=4;
infix.push_back(aux);
}
i+=2;
}
else if(s[i]=='T'&&s[i+1]=='R'&&s[i+2]=='U'&&s[i+3]=='E')
{
aux.n=1;
aux.b=true;
infix.push_back(aux);
i+=3;
}
else if(s[i]=='F'&&s[i+1]=='A'&&s[i+2]=='L'&&s[i+3]=='S'&&s[i+4]=='E')
{
aux.n=1;
aux.b=false;
infix.push_back(aux);
i+=4;
}
}
}
//for(int i=0;i<n;i++);
}
int main()
{
char ch;
short n;
readInfix();
infixToPostfix();
/*for(int i=0; i<infix.size(); i++)
printExpression(infix[i]);
g<<endl;
for(int i=0; i<postfix.size(); i++)
printExpression(postfix[i]);
g<<endl;*/
l=postfix.size()-1;
R=createNode();
f>>n;
f.get();
for(int i=0; i<n; i++)
{
f>>ch;
values[ch-'A']=!values[ch-'A'];
//g<<values[ch-'A']<<endl;
g<<expressionValue(R);
}
f.close();
g.close();
return 0;
}