Cod sursa(job #791749)

Utilizator toranagahVlad Badelita toranagah Data 24 septembrie 2012 23:52:53
Problema Bool Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>
#include <string>
using namespace std;

ifstream fin("bool.in");
ofstream fout("bool.out");
string s;

const int MAX_N = 1001;

bool val[27];
char qu[MAX_N];
int qu_back = 0;
char st[MAX_N];
int st_top = 0;
bool evSt[MAX_N];
int evSt_top = 0;

int N;

void shunting_yard();
char is_operator(int &pos);
int op(char ch);
bool rsy();

int main(int argc, char const *argv[])
{
    getline(fin, s);
    shunting_yard();
    fin >> N;
    fin.ignore();
    char c;
    for (int i = 0; i < N; ++i) {
        fin>>c;
        val[c - 'A'] = !val[c - 'A'];
        fout << rsy();
    }

    return 0;
}

void shunting_yard() {
    char ch;
    for (int i = 0; i < s.size(); ++i) {
        if (ch = is_operator(i)) {
            if (ch == '0' || ch == '1') {
                qu[++qu_back] = ch;
            } else {
                while (st_top > 0 && op(ch) < op(st[st_top])) {
                    qu[++qu_back] = st[st_top];
                    --st_top;
                }
                st[++st_top] = ch;
            }
        } else if (isalpha(s[i])) {
            qu[++qu_back] = s[i];
        } else if (s[i] == '(') {
            st[++st_top] = s[i];
        } else if (s[i] == ')') {
            while (st_top > 0 && st[st_top] != '(') {
                qu[++qu_back] = st[st_top];
                --st_top;
            }
            --st_top;
        } 
    }
    while (st_top > 0) {
        qu[++qu_back] = st[st_top];
        --st_top;
    }
}

bool rsy() {
    bool result;
    evSt_top = 0;
    for (int i = 1; i <= qu_back; ++i) {
        if (isalpha(qu[i])) {
            evSt[++evSt_top] = val[qu[i] - 'A'];
        } else if (qu[i] == '1') {
            evSt[++evSt_top] = true;
        } else if (qu[i] == '0') {
            evSt[++evSt_top] = false;
        } else if (qu[i] == '~') {
            evSt[evSt_top] = !evSt[evSt_top];
        } else if (qu[i] == '&') {
            evSt[evSt_top - 1] = evSt[evSt_top - 1] && evSt[evSt_top];
            --evSt_top;
        } else if (qu[i] == '|') {
            evSt[evSt_top - 1] = evSt[evSt_top - 1] || evSt[evSt_top];
            --evSt_top;
        }
    }
    result = evSt[evSt_top];
    --evSt_top;
    return result;
}

char is_operator(int &pos) {
    if (s.substr(pos, 3) == "NOT") {
        pos += 2;
        return '~';
    } else if (s.substr(pos, 3) == "AND") {
        pos += 2;
        return '&';
    } else if (s.substr(pos, 2) == "OR") {
        pos += 1;
        return '|';
    } else if (s.substr(pos, 4) == "TRUE") {
        pos += 3;
        return '1';
    } else if (s.substr(pos, 5) == "FALSE") {
        pos += 4;
        return '0';
    } else {
        return 0;
    }
}

int op(char ch) {
    if (ch == '~') {
        return 4;
    } else if (ch == '&') {
        return 3;
    } else if (ch == '|') {
        return 2;
    } else {
        return 0;
    }
}