POJ 3952,题目链接http://poj.org/problem?id=3295

题意:

输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式,

其中p、q、r、s、t的值为1(true)或0(false),即逻辑变量;

K、A、N、C、E为逻辑运算符,

K --> and:  x && y

A --> or:  x || y

N --> not :  !x

C --> implies :  (!x)||y

E --> equals :  x==y

输入格式保证是合法的,问这个逻辑表达式是否为永真式。

思路:

1. 从输入字符串末尾向前读取字符,构造一个栈,遇到pqrst则入栈,遇到N则取出栈顶一个值计算后入栈,遇到KACE则取栈顶两个值计算后入栈。最后栈内将只剩一个值,即该表达式的值。(与用栈计算算术表达式的方式一样)

2. 一个5个逻辑变量,每种情况都要考虑,那么一共2^5(0x1f)种情况。

代码:

//560K	0MS

#include <cstdio>
#include <cstring>
#include <stack>
using std::stack; //K, A, N, C, E //逻辑符号
//p, q, r, s, t //bool值
char buf[101];
stack<bool> s_stack;
bool data[5]={false};
bool WFF(char* str, int val)
{
//init p q r s t
for (int i=0; i<5; ++i){
data[i] = (1<<i) & val;
} while (! s_stack.empty()) s_stack.pop();
int strLen = strlen(str);
bool a,b;
while (--strLen >= 0)
{
switch (buf[strLen])
{
case 'p':
s_stack.push(data[0]);
break;
case 'q':
s_stack.push(data[1]);
break;
case 'r':
s_stack.push(data[2]);
break;
case 's':
s_stack.push(data[3]);
break;
case 't':
s_stack.push(data[4]);
break;
case 'K':
a=s_stack.top(); s_stack.pop();
b=s_stack.top(); s_stack.pop();
s_stack.push(a && b);
break;
case 'A':
a=s_stack.top(); s_stack.pop();
b=s_stack.top(); s_stack.pop();
s_stack.push(a || b);
break;
case 'N':
a=s_stack.top(); s_stack.pop();
s_stack.push(!a);
break;
case 'C':
a=s_stack.top(); s_stack.pop();
b=s_stack.top(); s_stack.pop();
s_stack.push(!a || b);
break;
case 'E':
a=s_stack.top(); s_stack.pop();
b=s_stack.top(); s_stack.pop();
s_stack.push(a == b);
break;
default:
break;
}
}
return s_stack.top();
} int main()
{
while (true)
{
memset(buf, 0, sizeof(char)*101);
scanf("%s", buf);
if (strcmp(buf, "0") == 0) break; bool tautology = true;
for (int val=0; val<=0x1f; ++val)
{
if (! WFF(buf, val)){
tautology = false;
break;
}
} if (tautology){
printf("tautology\n");
}else {
printf("not\n");
}
} return 0;
}

poj3295解题报告(构造、算术表达式运算)的更多相关文章

  1. PYTHON实现算术表达式构造二叉树

    LEETCOCE 224. Basic Calculator Implement a basic calculator to evaluate a simple expression string. ...

  2. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  3. 【算法】E.W.Dijkstra算术表达式求值

    算术表达式求值 我们要学习的一个栈的用例同时也是展示泛型的应用的一个经典例子,就是用来计算算术表达式的值,例如 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 如果将4乘以5,把3 ...

  4. Project Euler 93:Arithmetic expressions 算术表达式

    Arithmetic expressions By using each of the digits from the set, {1, 2, 3, 4}, exactly once, and mak ...

  5. poj分类解题报告索引

    图论 图论解题报告索引 DFS poj1321 - 棋盘问题 poj1416 - Shredding Company poj2676 - Sudoku poj2488 - A Knight's Jou ...

  6. 【LeetCode】150. Evaluate Reverse Polish Notation 解题报告(Python)

    [LeetCode]150. Evaluate Reverse Polish Notation 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/ ...

  7. 【LeetCode】678. Valid Parenthesis String 解题报告(Python)

    [LeetCode]678. Valid Parenthesis String 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人 ...

  8. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  9. LeetCode 2 Add Two Sum 解题报告

    LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...

随机推荐

  1. Some_sort_algorithms

    复习下数据结构常用的排序算法,更多内容上wiki 快速排序(不稳定 O(n log n)) 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出.它的基 ...

  2. matplotlib绘制三维图

    本文参考官方文档:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html 起步 新建一个matplotlib.figure.Figure对象, ...

  3. int.class与Integer.type的不同

    int.class返回Integer的对象 Integer.type返回int对象

  4. Codevs No.1281 Xn数列

    2016-06-01 16:28:25 题目链接: Xn数列 (Codevs No.1281) 题目大意: 给定一种递推式为 Xn=(A*Xn-1+C)%M 的数列,求特定的某一项%G 解法: 矩阵乘 ...

  5. es 的集群状态

    es的集群状态一共有三种 : green yellow red 状态是基于 碎片的 等级进行划分的 .

  6. jar,war,ear区别及java基础杂七八

    jar,war,earqu区别 这三种文件都可以看作是java的压缩格式,其实质是实现了不同的封装: jar--封装类war--封装web站点ear--封装ejb.它们的关系具体为:jar:      ...

  7. DelphiXE8新建AVD

    相关资料: 1.http://jingyan.baidu.com/article/ea24bc398576b3da62b33107.html

  8. HDU 4864 Task (贪心)

    Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/121336#problem/B Description Today the company has ...

  9. jquery easyui防止超出浏览器边界

    var easyuiPanelOnMove=function(left,top){ if(left<0){ $(this).window('move',{ left:1 }); } if(top ...

  10. BestCoder Round #73 (div.2)(hdu 5630)

    Rikka with Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...