well I wrote a function to evaluate the boolean expression for a particular combination of itz variables. So far it works for expressions like !A+!B (or A'+B')
But doesnt work for expressions like this: !(A+B).
Thatz bcos to get the postfix expression i assumed that in the infix expression a ! or ' character will always be followed by a variable.
I guess i need to consider the precedence of unary operator '!' or ' ' ' when converting to postfix. Since in the boolean expression there is only one such unary operator i need to know only itz precedence. Here's my fuctions for precedence, topostfix and evaluate:
the precedence function:
int precedence(char token, int type)
{
if((token >= 'A' && token <= 'Z') || (token >= '1' && token <= '9'))
return 9;
else if ( token == '*' || token == '&')
return 4;
else if ( token == '+' | token == '|')
return 3;
else if ( token == '(')
return (type == 1? 9: 2);
else if (token == ')')
return (type == 1? 2: 9);
else
return 0;
}
To convert infix to postfix:
void topostfix(LinkedList<char> &infix,LinkedList<char> &post)
{
Stack<char> inter;
char last = 0;
char temp;
char item;
for(Node<char> *current = infix.GetFirstNode(); current != NULL; current = current->GetNext())
{
item = current->GetItem();
if( item == '!')
post.InsertatLast(last = item);
else if (precedence(item, 1) > precedence(last,2))
{
inter.Push(last = item);
if(current->GetNext() != NULL && (temp = ((current->GetNext())->GetItem())) == '\'')
{
post.InsertatLast(temp);
current = current->GetNext();
}
}
else if(precedence(current->GetItem(),1) <= precedence(last,2))
{
while(!inter.isEmpty())
{
if(precedence(temp = inter.Pop(),2) >= precedence(current->GetItem(),1))
{
if(temp != '(' && temp != ')')
post.InsertatLast(temp);
}
else
{
if(temp != '(' && temp != ')')
inter.Push(last = temp);
break;
}
}
if (item != '(' && item != ')')
inter.Push(last = item);
}
}
while(!inter.isEmpty())
post.InsertatLast(inter.Pop());
post.PrintList();
}
Finally the function to evaluate the boolean expression:
int evaluate(LinkedList<char> &post, int combination, int no_var)
{
int mask = 1;
char token;
int temp;
for(Node<char> * walk = post.GetFirstNode(); walk != NULL; walk = walk->GetNext())
{
token = walk->GetItem();
if( token >= '1' && token <= (char)(no_var + '0'))
{
mask <<= (no_var - (token - '0'));
temp = combination & mask;
walk->SetItem(temp == 0? 0 :1);
mask = 1;
}
}
cout<<"\n";
post.PrintList();
cout<<"\n";
Stack<int> result;
for(Node<char> * walk = post.GetFirstNode(); walk != NULL; walk = walk->GetNext())
{
token = walk->GetItem();
if((int)token == 0 || (int)token == 1)
result.Push(token);
else if( ispunct(token))
{
if(token == '\'' || token == '!')
(walk->GetNext())->SetItem((walk->GetItem() == 0? 1: 0));
else if(token == '+' || token == '|')
{
temp = result.Pop() | result.Pop();
result.Push(temp);
}
else if(token == '*' || token == '&')
{
temp = result.Pop() & result.Pop();
result.Push(temp);
}
}
}
return result.Pop();
}
What necessary changes shud i make to account for the boolean ! operator?