POJ3295

POJ原址:POJ3295

(首先题外话,用Chrome核打开CSDN编辑页面的时候就没有出现过用IE核的那种情况了)

这道题嘛,虽然归类是在什么构造法什么的里面,但是最大的作用就是让我明白了栈的运行方式,参考了很大一部分,当然也学到了很多。

参考链接:

POJ3295-Tautology - ζёСяêτ - 小優YoU - 博客频道 - CSDN.NET


收获:

1.直接用STL的栈,只要加上头文件#include<stack>

引用百科对Stack的描述:

/*
#include<stack>头文件,STL中的很有用的容器适配器之一,默认基于Deque容器实现,可以在定义时覆盖其默认容器类型,但一般并不需要。
包含以下几个成员函数:
empty() 堆栈为空则返回真
pop() 移除栈顶元素(不会返回栈顶元素的值)
push() 在栈顶增加元素
size() 返回栈中元素数目
top() 返回栈顶元素*/

2.复习switch开关语句,本来的Isvariable函数自己是这么写的

 bool Isvariable(char ch)
 {
 	if(ch=='p'||ch=='q'||ch=='r'||ch=='s'||ch=='t')
 	{
 		s.push(ch);//s.push是在栈顶增加元素 
		return true;
 	}
 	else
	return false; 
 }
但是想想发现s.push的并不是收到的字符ch,而是那些字符的value值(也就是0,1值),所以就只能用switch,目测真不能简化。




程序:

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;

int value_p,value_q,value_r,value_s,value_t;
stack<int> s;

 bool Isvariable(char ch);
 void work(char w);
 
 int main()
 {
 	char WFF[110];
 	while(cin>>WFF&&WFF[0]!='0')
 	{
 		int len=strlen(WFF);
 		bool flag=true;//初值定为true
		for(value_p=0;value_p<=1;value_p++)
		{
			for(value_q=0;value_q<=1;value_q++)
			{
				for(value_r=0;value_r<=1;value_r++)
				{
					for(value_s=0;value_s<=1;value_s++)
					{
						for(value_t=0;value_t<=1;value_t++)
						{
							
							for(int last=len-1;last>=0;last--)//主要的循环操作 
							{
								if(Isvariable(WFF[last])==false)//若不是变量p q r s t
								work(WFF[last]);
							}//栈的操作进行已完毕
							int ans=s.top();//取栈顶,当然也就只有一个数了
							s.pop(); //将这一个数移出
							if(ans==0)
							{
								flag=false;
								break;//其他的p,q,r,s,t情况也无需再考虑 
							} //但是这个循环内的break只是跳出这一个循环,所以后面每一个循环都还要加break 
							
						}
						if(flag==false)
						break; 
					}
					if(flag==false)
					break; 
				}
				if(flag==false)
				break; 
			}
			if(flag==false)
			break; 
		} 
		
		if(flag==true)
     	cout<<"tautology"<<endl;
    	else
    	cout<<"not"<<endl;
 	}
 	return 0;
 }
 
bool Isvariable(char ch)
{
	switch(ch)
	{
	    case 'p':s.push(value_p);return true;
		case 'q':s.push(value_q);return true;
		case 'r':s.push(value_r);return true;
		case 's':s.push(value_s);return true;
		case 't':s.push(value_t);return true;
	}
	return false;
}
 
 void work(char w)
 {
 	switch(w)//要注意switch的语法 
 	{
 		case'K':
 		{
 			int x=s.top();//用x存放栈顶元素 
 			s.pop();//移出栈顶元素
			int y=s.top();//用y存放原来的第二个元素
			s.pop();
			s.push(x&&y);//将x&&y的值压入栈中
			break; 
 		}
 		case'A':
 		{
 			int x=s.top();
 			s.pop();
			int y=s.top();
			s.pop();
			s.push(x||y);
			break; 
		}
		case'C':
 		{
 			int x=s.top();
 			s.pop();
			int y=s.top();
			s.pop();
			s.push(!x||y);
			break; 
		}
		case'E':
 		{
 			int x=s.top();
 			s.pop();
			int y=s.top();
			s.pop();
			s.push(x==y);
			break; 
		}
		case'N':
 		{
 			int x=s.top();
 			s.pop();
 			s.push(!x);
 			break;
		}
 	}
 	return;
 } 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值