Cod sursa(job #980941)

Utilizator smaraldaSmaranda Dinu smaralda Data 5 august 2013 22:44:31
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stack>
#include<vector>
using namespace std;

stack <char> op;
char ln[1010];
vector <char> polo,exp;
bool var[300];

int priority (char ch) {
    if(ch=='!') return 3;
    if(ch=='*') return 2;
    if(ch=='+') return 1;
}

void baga (char ch) {
    if(isalnum(ch)){
        polo.push_back(ch);
        return ;
        }

    if(ch=='(') {
        op.push(ch);
        return ;
        }

    if(ch==')') {
        while(op.top() != '(') {
              polo.push_back(op.top());
              op.pop();
              }
        op.pop();
        return;
        }

    while(!op.empty() && op.top()!='(' && (priority(ch) <= priority(op.top()) && !(ch=='!' && op.top()=='!'))) {
        polo.push_back(op.top());
        op.pop();
        }
    op.push(ch);
}

bool solve() {
    int i;
    exp=polo;
    for(i=0;i<exp.size();i++) {
        if(exp[i]=='+') {
            exp[i]=(var[exp[i-1]] || var[exp[i-2]]) + '0';
            exp.erase(exp.begin()+i-2,exp.begin()+i);
            i-=2;
            }
        if(exp[i]=='*') {
            exp[i]=(var[exp[i-1]] && var[exp[i-2]]) + '0';
            exp.erase(exp.begin()+i-2,exp.begin()+i);
            i-=2;
            }
        if(exp[i]=='!') {
            exp[i-1]=!var[exp[i-1]]+'0';
            exp.erase(exp.begin()+i);
            i-=2;
            }
        }
    return exp[0]-'0';
}

int main() {
    freopen("bool.in","r",stdin);
    freopen("bool.out","w",stdout);
    int n,ch,i,cnt=-1;

    gets(ln);

    n=strlen(ln);
    for(i=0;i<n;i++) {
        if(ln[i]==' ')
            continue;
        if( ln[i]=='(' || ln[i]==')' || ( isalpha(ln[i]) && !isalpha(ln[i+1]) ) ) {
            baga(ln[i]);
            continue;
            }
        if(ln[i]=='O') {
            baga('+');
            i++;
            continue;
            }
        if(ln[i]=='T') {
            baga('1');
            i+=3;
            continue;
            }
        if(ln[i]=='F') {
            baga('0');
            i+=4;
            continue;
            }
        if(ln[i]=='A') {
            baga('*');
            i+=2;
            continue;
            }
        if(ln[i]=='N') {
            baga('!');
            i+=2;
            continue;
            }
        }

    while(!op.empty()) {
        polo.push_back(op.top());
        op.pop();
        }

    var['1']=1;
    scanf("%d\n",&n);
    for(i=1;i<=n;i++) {
        scanf("%c",&ch);
        var[ch]=!var[ch];
        printf("%d",solve());
        }
    printf("\n");
    return 0;
}