【ACM】POJ 3295 Tautology

本文介绍了一种通过枚举变量所有可能取值并利用栈进行计算的方法,来判断一个给定的前置逻辑表达式是否为永真式。文章详细展示了如何根据特定的逻辑运算符构建计算过程,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  该题的意思就是:给你一个表达式,判断它是否为永真式,若是输出tautology,否输出not。

  解题步骤:1.根据题内所示表格构造K,A,N,C,E的运算
                   2.枚举p,q,r,s,t的32种情况
                   3.表达式的计算
  注意事项:1.表达式为前置表达式,需从数组末尾开始遍历
                   2.全局变量每循环一次需重置
  ps:p,q,r,s,t的存储可用数组实现也可用map实现

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <map>
using namespace std;
char a[110];
int num[5];
int sign=1;//标记是否均符合要求 
stack <int> cal;//运算栈
int len;
int calculate()//前缀表达式的运算 
{
	int m,n;
	while(!cal.empty())
	cal.pop();
	for(int i=len-1;i>=0;i--)
	{
		if(a[i]=='p')//操作数部分 
		cal.push(num[0]);
		else if(a[i]=='q')
		cal.push(num[1]);
		else if(a[i]=='r')
		cal.push(num[2]);
		else if(a[i]=='s')
		cal.push(num[3]);
		else if(a[i]=='t')
		cal.push(num[4]);
		else//操作符部分 
		{
			m=cal.top();//取最顶上一个操作数,因为有非运算所以只取一个 
			cal.pop();
			if(a[i]=='N')
			cal.push(!m);
			else
			{
				n=cal.top();
				cal.pop();
				if(a[i]=='K')
				cal.push(m&&n);
				else if(a[i]=='A')
				cal.push(m||n);
				else if(a[i]=='C')
				{
					if(m==1&&n==0)
					cal.push(0);
					else
					cal.push(1);
				}
				else if(a[i]=='E')
				{
					if(m==n)
					cal.push(1);
					else
					cal.push(0);
				}
			} 
		}
	}
	return cal.top();
} 
int main()
{
	while(cin.getline(a,110))
	{
		if(a[0]=='0')
		break;
		len=strlen(a);
		for(int p=0;p<2&&sign;p++)
		{
			num[0]=p;
			for(int q=0;q<2&&sign;q++)
			{
				num[1]=q;
				for(int r=0;r<2&&sign;r++)
				{
					num[2]=r;
					for(int s=0;s<2&&sign;s++)
					{
						num[3]=s;
						for(int t=0;t<2&&sign;t++)
						{
							num[4]=t;
							if(calculate()==0)
							sign=0;
						}
					}
				}
			}
		}
		if(!sign)
		cout<<"not"<<endl;
		else
		cout<<"tautology"<<endl;
		sign=1;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值