//5_2_2: Boolean Expressions 布尔表达式求值 POJ2106 ZOJ2483
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/***********优先级比较***********/
/*-----------------------------*/
/* '(' | '|' | '&' | '!' | ')' */
/* 0 | 1 | 2 | 3 | 4 */
/*-----------------------------*/
const int maxn = 200;
int val[maxn],opr[maxn],val_top,opr_top;
void insert(int Bool)
{
while(opr_top >= 0 && opr[opr_top] == 3) //!的优先级最高,所以直接计算
{ //有连续!的情况出现
Bool = !Bool; //0和1之间转换的技巧
opr_top --;
}
val[++val_top] = Bool;
}
void calc() //进行双目运算
{
int b = val[val_top --];
int a = val[val_top --];
int op = opr[opr_top --];
if(op == 1) insert(a | b);
else if(op == 2)insert(a & b);
}
int main()
{
char c;
int loop = 1;
while((c = getchar()) != EOF)
{
val_top = opr_top = -1;
do{
if(c == '(') opr[++opr_top] = 0;
else if(c == ')')
{
while(opr_top >= 0 && opr[opr_top] != 0) calc();
opr_top --; //把左括号,即0出栈
insert(val[val_top--]); //!(...)这种情况,把!号干掉
}
else if(c == '!') opr[++opr_top] = 3;
else if(c == '&')
{
while(opr_top >= 0 && opr[opr_top] >= 2) calc();
opr[++opr_top] = 2;
}
else if(c == '|')
{
while(opr_top >= 0 && opr[opr_top] >= 1) calc();
opr[++opr_top] = 1;
}
else if(c == 'V') insert(1);
else if(c == 'F') insert(0);
}while((c = getchar()) != '\n' && c != EOF);
while(opr_top >= 0)
calc();
printf("Expression %d: %c\n",loop ++,val[0] ? 'V' : 'F');
}
return 0;
}
/*测试结果:通过POJ2106 ZOJ2483检测
!!!!!!!F&(F|V)
Expression 1: V
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
Expression 2: V
^Z
请按任意键继续. . .
*/
POJ2106 ZOJ2483 Boolean Expressions
最新推荐文章于 2018-04-10 16:07:43 发布