POJ-3295 Tautology---栈+表达式求值
题目链接:
https://vjudge.net/problem/POJ-3295
题目大意:
输入由p、q、r、s、t、K、A、N、C、E共10个字母组成的逻辑表达式WFF
其中
p、q、r、s、t的值为1(true)或0(false),即逻辑变量.
K、A、N、C、E为逻辑运算符,含义如下:
问WFF是否为【永真式】 (大前提:【输入格式保证是合法的】)
思路:
可以把上述打表,然后求表达式的时候用栈,从后往前来模拟。之后在网上看到各个大写字母转化成具体表达式:
K --> and: w && x
A --> or: w || x
N --> not : !w
C --> implies : (!w) || x
E --> equals : w == x
总共5个小写字母,直接枚举,然后每个表达式进行判断即可
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
bool a[];
map<char, int>Map;
bool vis[][][];
void init()
{
Map['K'] = ;
Map['A'] = ;
Map['C'] = ;
Map['E'] = ;
//K w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//A w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//C w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
//E w x
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
vis[][][] = ;
}
string s;
bool solve()
{
stack<bool>q;
for(int i = s.size() - ; i >= ; i--)
{
if(islower(s[i]))q.push(a[s[i] - 'p']);
else
{
if(s[i] == 'N')
{
bool w = q.top();
q.pop();
w = !w;
q.push(w);
}
else
{
bool w = q.top();
q.pop();
bool x = q.top();
q.pop();
q.push(vis[Map[s[i]]][w][x]);
}
}
}
return q.top();
}
int main()
{ init();
while(cin >> s)
{
if(s.size() == && s[] == '')break;
bool ok = ;
for(int i = ; i < (<<); i++)
{
for(int j = ; j < ; j++)
{
if(i & ( << j))a[j] = ;
else a[j] = ;
}
if(!solve()){ok = ;break;}
}
if(ok)cout<<"tautology"<<endl;
else cout<<"not"<<endl;
}
return ;
}
POJ-3295 Tautology---栈+表达式求值的更多相关文章
- poj 3295 Tautology(栈)
题目链接:http://poj.org/problem?id=3295 思路分析:判断逻辑表达式是否为永真式问题.根据该表达式的特点,逻辑词在逻辑变量前,类似于后缀表达式求值问题. 算法中使用两个栈, ...
- (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)
/* * POJ_2106.cpp * * Created on: 2013年10月30日 * Author: Administrator */ #include <iostream> # ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- 【NYOJ-35】表达式求值——简单栈练习
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 表达式求值 (栈) 用C++实现
#include <cstdio> #include <cstdlib> #include <cmath> #include <stack> #incl ...
- 表达式求值(栈方法/C++语言描述)(二)
上篇中完成了对表达式求值的整体过程,接下来看看如何处理不同类型的token. 对运算数的处理比较简单,它直接调用函数strtod(),将字符串中的运算数转换为浮点类型并将它压入运算数栈中: void ...
- 第四届河南省ACM 表达式求值 栈
表达式求值 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 7 [提交][状态][讨论版] 题目描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简 ...
- Matrix Chain Multiplication(表达式求值用栈操作)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/100 ...
随机推荐
- Vue解析三之过滤器
export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.g ...
- Java注解学习笔记
我们平常写Java代码,对其中的注解并不是很陌生,比如说写继承关系的时候经常用到@Override来修饰方法.但是@Override是用来做什么的,为什么写继承方法的时候要加上它,不加行不行.如果对J ...
- 用Arduino制作一个二维码显示器
先上图 场景是这样的, 这几天给CS系统做一个微信支付的功能, 但是生成的二维码是在前台的电脑上..不可能让用户跑到前台的电脑上去扫描...然后拿出了N年前买的Arduino 做了一个二维码显示器. ...
- 使用IDEA搭建Spring Boot入门项目
简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置 ...
- centos7上安装ffmpeg
FFmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音 ...
- 201621123062《java程序设计》第12周作业总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 思维导图: 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2. ...
- Bate敏捷冲刺每日报告--day2
1 团队介绍 团队组成: PM:齐爽爽(258) 小组成员:马帅(248),何健(267),蔡凯峰(285) Git链接:https://github.com/WHUSE2017/C-team 2 ...
- C语言——第四次作业
题目 题目一:计算分段函数 1.实验代码 #include <stdio.h> int main() { double x,y; scanf("%lf",&x) ...
- mvc架构模式概念
MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器".MVC应用程序总是由这三个部分组成.Event(事件)导致C ...
- Flask 学习 十一 关注者
数据库关系 1.1多对多关系 添加第三张表(关联表),多对多关系可以分解成原表和关联表之间的两个一对多的关系 多对多仍然使用db.relationship()方法定义,但是secondary参数必须设 ...