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. vi--文本编辑常用快捷键之光标移动

    再来一发! 上一篇关于vi/vim的文章中,主要介绍了文本的复制粘贴删除替换等操作,在慢慢的适应vim的过程中,我发现有很多时间实际上是浪费在移动光标上的,特别是行内移动光标.这篇文章就主要是介绍vi ...

  2. redis在mac上的安装

    mac 上安装 redis 首先必须保证mac 已经安装 xcode. 因为make时要用到 Xcode 的command Tools . (1)下载 redis   http://redis.goo ...

  3. Junit3.8

    使用Junit的最佳实践:新建一个名为test的source folder,用于存放测试类源代码目标类与测试类应该位于同一个包下面,这样测试类中就不必导入源代码所在的包,因为他们位于同一个包下面 测试 ...

  4. 安装 RabbitMQ C#使用-摘自网络(包括RabbitMQ的配置)

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/ . 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理 ...

  5. 【转】Nginx系列(四)--工作原理

    原博文出于:    http://blog.csdn.net/liutengteng130/article/details/46724081  感谢! 上篇文章介绍了Nginx框架的设计之管理进程以及 ...

  6. Java IO (1) - InputStream

    Java IO (1) - InputStream 前言 JavaIO一共包括两种,一种是stream,一种是reader/writer,每种又包括in/out,所以一共是四种包.Java 流在处理上 ...

  7. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. sping配置文件中引入properties文件方式

    <!-- 用于引入 jdbc有配置文件参数 可以使用PropertyPlaceholderConfigurer 或者PropertyOverrideConfigurer --> <b ...

  9. css知识汇总

    <style type="text/css"> table{ border-collapse:collapse; } table, td, th{ border:1px ...

  10. HDU 4462 Scaring the Birds (暴力求解,二进制法)

    题意:给定一个 n*n的矩阵,在一些位置放上稻草人,每个稻草人的范围是一定,问你最少几个能覆盖整个矩阵. 析:稻草人最多才10个,所以考虑暴力,然后利用二进制法,很容易求解,并且时间很少0ms,注意有 ...