题意: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; }