Pagini recente » Cod sursa (job #1653936) | Cod sursa (job #1224857) | Cod sursa (job #1673530) | Cod sursa (job #1565291) | Cod sursa (job #2275689)
#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;
}