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;
}