Cod sursa(job #1990004)

Utilizator PondorastiAlex Turcanu Pondorasti Data 9 iunie 2017 21:05:26
Problema Bool Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.89 kb
#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <ctype.h>
using namespace std;
string line, a[3000];
int k = 0, o = 0, n, stackAlpha[3000], stackOp[3000];
int priority[3000];
bool alf[30];
int length;
void Read();
void Solve();
int Calculator(int a, int b, int c);
int main()
{
    ifstream cin("bool.in");
    ofstream cout("bool.out");
    getline(cin,line);
    Read();
    cin>>n;
    cin.ignore();
    for(int i = 1 ; i <= n ; ++i) {
        char ch;
        cin>>ch;
        alf[ch - 'A'] = !alf[ch - 'A'];
        Solve();
        cout<<stackAlpha[k];
    }
    /*for(int i =1 ; i <= length ; ++i)
        cout<<a[i];*/
    return 0;
}
void Solve() {
    priority['|'] = 1;
    priority['&'] = 2;
    priority['!'] = 3;
    priority['('] = 4;
    int i = 1, x = 0;
    k = 0, o = 0;
    while(i <= length + 1) {
        char ch = a[i][0];
        if('A' <= ch && ch <= 'Z') {
            stackAlpha[++k] = alf[ch - 'A'];
        }
        else if(ch == '>')
            stackAlpha[++k] = 1;
        else if(ch == '<')
            stackAlpha[++k] = 0;
        else if(ch == ')') {
            while(stackOp[o] != '(') {
                    stackAlpha[++k] = stackOp[o--];
                    if(stackAlpha[k] != '!')
                        x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
                    else
                        x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
                    stackAlpha[k] = x;
                  }
            --o;
        }
        else {
            while(o > 0 && k > 0 && stackOp[o] != '(' && priority[stackOp[o]] >= priority[ch]) {
                    stackAlpha[++k] = stackOp[o--];
                    if(stackAlpha[k] != '!')
                        x = Calculator(stackAlpha[k-2],stackAlpha[k-1],stackAlpha[k]), k -= 2;
                    else
                        x = Calculator(stackAlpha[k-1],stackAlpha[k-1],stackAlpha[k]), --k;
                    stackAlpha[k] = x;
                  }
            stackOp[++o] = ch;
        }
        ++i;
    }
}
int Calculator(int a, int b, int c) {
    switch (c) {
        case '!': return !a;
        case '&': return a & b;
        case '|': return a | b;
    }
}
void Read() {
    stringstream sin(line);
    char ch;
    string word = "";
    /*while(sin>>ch) {
        word += ch;
    cout<<word<<"\n";
        if(word == "N" && ch == 'O')
            a[++length] = '!' ,word = "" ,sin>>ch ;
        else if(word == "A" && ch == 'N')
            a[++length] = '&' ,word = "" ,sin>>ch ;
        else if(word == "O" && ch == 'R')
            a[++length] = '|' ,word = "" ,sin>>ch;
        else if(word == "T" && ch == 'R')
            a[++length] = '>', word ="" ,sin>>ch ,sin>>ch ;
        else if(word == "F" && ch == 'A')
            a[++length] = '<', word ="" ,sin>>ch ,sin>>ch ,sin>>ch;
        else if(word != "")
            a[++length] = word ,word = "";

    }*/
    for(int i = 0 ; i < line.size() ; ++i) {
        if(line[i] == 'N' && line[i+1] == 'O') {
            word = "!";
            a[++length] = word;
            i+=2;
        }
        else if(line[i] == 'O' && line[i+1] == 'R') {
            word = "|";
            a[++length] = word;
            i+=1;
        }
        else if(line[i] == 'A' && line[i+1] == 'N') {
            word = "&";
            a[++length] = word;
            i+=2;
        }
        else if(line[i] == 'T' && line[i+1] == 'R') {
            word = ">";
            a[++length] = word;
            i+=3;
        }
        else if(line[i] == 'F' && line[i+1] == 'A') {
            word = "<";
            a[++length] = word;
            i+=4;
        }
        else if(isalpha(line[i]) || line[i]=='(' || line[i]==')') {
            word = line[i];
            a[++length] = word;
        }

    }

}