Pagini recente » Cod sursa (job #935328) | Cod sursa (job #1089216) | Cod sursa (job #3189199) | Cod sursa (job #2705623) | Cod sursa (job #1826635)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in ("bool.in");
ofstream out ("bool.out");
int const NMAX = 2000;
char line[NMAX];
int infix[NMAX] , postfix[NMAX] , opstack[NMAX] , val[260];
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++;
while(opstack[oppointer - 1] == 4){
postfix[postfixp] = opstack[oppointer-1];
oppointer--;
postfixp++;
}
} else if(infix[i] == -1 || infix[i] == 4){
opstack[oppointer] = infix[i];
oppointer++;
} else if(infix[i] == -2){
while(opstack[oppointer - 1] != -1){
postfix[postfixp] = opstack[oppointer-1];
oppointer--;
postfixp++;
}
oppointer--;
}
else {
while(opstack[oppointer-1] >= infix[i]){
postfix[postfixp]=opstack[oppointer-1];
oppointer--;
postfixp++;
}
opstack[oppointer] = infix[i];
oppointer++;
}
}
while(oppointer > 0){
postfix[postfixp] = opstack[oppointer-1];
oppointer--;
postfixp++;
}
}
int temp[NMAX],pointer = 0 ,rez[NMAX] ,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
cout<<pointer<<"|"<<'\n';
for(int i = 0 ; i < pointer ; i++){
if(temp[i] < 2){
rez[rezp] = temp[i];
rezp++;
cout<<":";
}
else{
if(temp[i] == 4){
rez[rezp - 1] = 1 - rez[rezp - 1];
cout<<rez[rezp - 1]<<" "<<rezp<<'\n';
} 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 ,2000, '\n');
chartoinfix();
infixtopostfix();
// for(int i = 0 ; i < postfixp ; i++)
// cout<<postfix[i]<<" ";
int n;
char c;
in>>n;
//cout<<n;
for(int j = 0 ; j < n ; j++){
in>>c;
if(c>='A' && c<= 'Z'){
val[c]=1-val[c];
}
eval();
out<<rez[0];
//cout<<":";
}
return 0;
}