POJ2106 ZOJ2483 Boolean Expressions

//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
请按任意键继续. . .
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值