Pagini recente » Cod sursa (job #1995405) | Cod sursa (job #2102752) | Cod sursa (job #1469867) | Cod sursa (job #2801357) | Cod sursa (job #1825809)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in ("bool.in");
ofstream out ("bool.out");
char line[1010];
int infix[1010] , postfix[1010] , opstack[1010] , val[200];
int infixp = 0 , postfixp = 0 , oppointer = 0;
void chartoinfix(){
int i = 0;
while(line[i] != '\0'){
if(line[i]=='T' && line[i+1]=='R' && line[i+2]=='U' && line[i+3]=='E'){
infix[infixp] = 1;
infixp++;
i+=4;
} else if(line[i]=='F' && line[i+1]=='A' && line[i+2]=='L' && line[i+3]=='S' && line[i+4]=='E'){
infix[infixp] = 0;
infixp++;
i+=5;
} else if(line[i] == 'N' && line[i+1] == 'O' && line[i+2] == 'T'){
infix[infixp] = 4;
infixp++;
i+=3;
} else if(line[i] == 'A' && line[i+1] == 'N' && line[i+2] == 'D'){
infix[infixp] = 3;
infixp++;
i+=3;
} else if(line[i] == 'O' && line[i+1] == 'R'){
infix[infixp] = 2;
infixp++;
i+=2;
} else if(line[i]>='A' && line[i]<='Z'){
infix[infixp] = int(line[i]);
infixp++;
i++;
} else if (line[i]=='('){
infix[infixp] = -1;
infixp++;
i++;
} else if (line[i]==')'){
infix[infixp] = -2;
infixp++;
i++;
} else
i++;
}
}
void infixtopostfix(){
for(int i = 0 ; i < infixp ; i++){
if(infix[i]>='A' || (infix[i] == 0 || infix[i] == 1)){
postfix[postfixp] = infix[i];
postfixp++;
} else if(infix[i] == -1){
opstack[oppointer] = infix[i];
oppointer++;
} else if(infix[i] == -2){
while(opstack[oppointer - 1] != -1){
postfix[postfixp] = opstack[oppointer-1];
oppointer--;
postfixp++;
}
oppointer--;
}
else if(infix[i]== 3 || infix[i]== 4){
while(opstack[oppointer-1] >= infix[i] && oppointer > 0){
postfix[postfixp]=opstack[oppointer-1];
oppointer--;
postfixp++;
}
opstack[oppointer] = infix[i];
oppointer++;
} else if (infix[i] == 4) {
opstack[oppointer] = infix[i];
oppointer++;
} else {
postfix[postfixp]=opstack[oppointer-1];
postfixp++;
}
}
while(oppointer > 0){
postfix[postfixp] = opstack[oppointer-1];
oppointer--;
postfixp++;
}
}
int temp[1010],pointer = 0 ,rez[1010] ,rezp;
void eval(){
rezp = 0;
///initiere nou vector
for(int i = 0 ;i < postfixp ; i++){
temp[i]=postfix[i];
if(temp[i] >= 'A')
temp[i]=val[temp[i]];
}
pointer = postfixp;
///evaluare in sine
for(int i = 0 ; i < pointer ; i++){
if(temp[i] < 2){
rez[rezp] = temp[i];
rezp++;
}
else{
if(temp[i] == 4){
rez[rezp - 1] = 1 - rez[rezp - 1];
} else if(temp[i] == 3){
if(rez[rezp - 2] + rez[rezp - 1] == 2)
rez[rezp - 2] = 1;
else
rez[rezp - 2] = 0;
rezp--;
} else if(temp[i] == 2){
if(rez[rezp - 2] + rez[rezp - 1] > 0)
rez[rezp - 2] = 1;
else
rez[rezp - 2] = 0;
rezp--;
}
}
}
}
int main()
{
in.getline(line ,1005, '\n');
chartoinfix();
infixtopostfix();
int n;
char c;
in>>n;
//cout<<n;
for(int j = 0 ; j < n ; j++){
in>>c;
val[c]=1-val[c];
eval();
out<<rez[0];
//cout<<":";
}
return 0;
}