Cod sursa(job #2275677)

Utilizator valorosu_300Cristian Gherman valorosu_300 Data 3 noiembrie 2018 13:30:58
Problema Bool Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.29 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("bool.in");
ofstream out("bool.out");
const int MAX_SIZE = 1002, LETTERS = 30;

bool values[LETTERS];
bool var[MAX_SIZE];
char expression[MAX_SIZE];
char postfix[MAX_SIZE];
char stack[MAX_SIZE];

bool isLetter(char ch){
    return ('A' <= ch && ch <= 'Z');
}

char getWord(int &pos, int len){
    char ch = expression[pos];
    switch(ch){
        case 'A' :{
            ///AND
            pos += 3;
            return '&';
        }
        case 'N' :{
            ///NOT
            pos += 3;
            return '!';
        }
        case 'O' :{
            ///OR
            pos += 2;
            return '|';
        }
        case 'T' :{
            ///TRUE
            pos += 4;
            return '1';
        }
        case 'F' :{
            ///FALSE
            pos += 5;
            return '0';
        }
        default : return 0;
    }
}

int precedence(char ch){
    switch(ch){
        case '!' : return 2;
        case '&' : return 1;
        case '|' : return 0;
        default : return -1; /// ch == '('
    }
}

void getPostfix(){
    int len = strlen(expression), h = -1, pos = 0, size = 0, prec;
    char ch, op;
    while(pos < len){
        ch = expression[pos];

        if(ch == ' ')
            pos++;

        else if(ch == '('){
            stack[++h] = ch;
            pos++;
        }

        else if(isLetter(ch)){
            if(pos == len - 1 || isLetter(expression[pos+1]) == false){
                postfix[size++] = ch;
                pos++;
            }

            else{
                op = getWord(pos,len);

                if(op == '1' || op == '0')
                    postfix[size++] = op;

                else{
                    prec = precedence(op);
                    while(h >= 0 && prec <= precedence(stack[h]))
                        postfix[size++] = stack[h--];
                    stack[++h] = op;
                }
            }
        }

        else if(ch == ')'){
            while(h >= 0 && stack[h] != '(')
                postfix[size++] = stack[h--];
            if(stack[h] == '(')
                h--;
            pos++;
        }

    }
    while(h >= 0)
        postfix[size++] = stack[h--];
}

bool getResult(bool a, bool b, char ch){
    switch(ch){
        case '&' : return (a && b);
        case '|' : return (a || b);
        default : return 0;
    }
}

bool evaluate(){
    int h = 0, len = strlen(postfix);
    bool a, b;
    char ch;
    for(int i=0;i<len;i++){
        ch = postfix[i];

        if(isLetter(ch))
            var[++h] = values[ch - 'A'];

        else if(ch == '0' || ch == '1')
            var[++h] = (ch - '0');

        else if(ch == '!')
            var[h] = !var[h];

        else{
            a = var[h--];
            b = var[h--];
            var[++h] = getResult(a,b,ch);
        }
    }

    return var[1];
}

int main()
{
    int n;
    char change;

    in.getline(expression,MAX_SIZE,'\n');
    in>>n;
    in.get();

    getPostfix();

    for(int i=1;i<=n;i++){
        in>>change;
        values[change - 'A'] = !values[change - 'A'];
        out<<evaluate();
    }

    in.close();
    out.close();
    return 0;
}