题意:http://blog.csdn.net/lyy289065406/article/details/6642766
并且,这篇文章中提到,采用栈的方法。想法值得学习。但感觉代码有点长。
我自己用vector写的如下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> stack; //0代表false 1代表true.
string s;
int judge(int index, int val)
{
int len = stack.size();
if (index < 0)
{
int out = 1;
for (int k = 0; k < len; ++k)
if (stack[k] == 0){ out = 0; break; }
return out;
}
if (islower(s[index]))
{
int temp;
switch (s[index])
{
case 'p': temp = (val & 16) >> 4; break;
case 'q': temp = (val & 8) >> 3; break;
case 'r': temp = (val & 4) >> 2; break;
case 's': temp = (val & 2) >> 1; break;
case 't': temp = (val & 1) >> 0; break;
default: return -1;
}
stack.push_back(temp);
}
else
{
if (len == 0) return -1; //针对这种情况:ApK---K后面没有元素
if (s[index] == 'N') stack[ len - 1] = !stack[len - 1];//一个元素的情况只能是:Np
else
{
if (len == 1)return -1;//针对这种情况:ApKq---K后面只有一个元素也不行
int temp;
switch (s[index])
{
case 'K': temp = stack[len - 1] & stack[len - 2]; break; //对stack的最后两个数进行操作,
case 'A': temp = stack[len - 1] | stack[len - 2]; break; //操作后将这两个数移除,并将结果加入stack。
case 'C': temp = (!stack[len - 1]) | stack[len - 2]; break;
case 'E': temp = stack[len - 1] == stack[len - 2]; break;
default: return -1;
}
stack.pop_back();
stack[len-2] = temp;
}
}
judge(index - 1, val);
}
int main()
{
string out;
while (cin >> s)
{
out = "tautology";
int flag = 0;
if (s == "0") break;
for (int i = 0; i < 32; ++i) //pqrst:组成5位二进制数,例如00100,表示r==1,其他为0
{
stack.clear();
flag = judge(s.length() - 1, i);
if (flag == -1){ cout << "输入有误!"; break; }
if (!flag){ out = "not"; break; }
}
if(flag!=-1)cout << out << endl;
}
return 0;
}
当然,网上还有更简单的,没有用到栈、vector之类的,就只有递归
(给我的启发式,代码写完后要再多看看、改改,进一步想想有没有更简单的方法了)
代码如下:http://www.cnblogs.com/asuran/archive/2009/09/28/1575379.html</span>
#include <iostream>
#include <string>
using namespace std;
static int pos = -1;
bool WFF(const string& formula, int i)
{
++pos;
switch (formula[pos])
{
case 'p':
return i & 1;
case 'q':
return (i >> 1) & 1;
case 'r':
return (i >> 2) & 1;
case 's':
return (i >> 3) & 1;
case 't':
return (i >> 4) & 1;
case 'N':
return !WFF(formula, i);
case 'K':
return WFF(formula, i) & WFF(formula, i);
case 'A':
return WFF(formula, i) | WFF(formula, i);
case 'C':
return !WFF(formula, i) | WFF(formula, i);
case 'E':
return WFF(formula, i) == WFF(formula, i);
}
return false;
};
bool isTautology(string formula)
{
for (int i = 0; i < 32; ++i)
{
pos = -1;
if (WFF(formula, i) == false) return false;;
}
return true;
};
int main(int argc, char* argv[])
{
string ln;
while (cin >> ln && ln[0] != '0')
{
if (isTautology(ln)) cout << "tautology/n";
else cout << "not/n";
}
return 0;
}