POJ 2106-Boolean Expressions,双栈运用类似表达式求值!

                                               Boolean Expressions

   首先声明此题后台可能极水(毕竟这种数据不好造!)。昨天写了一天却总是找不到bug,讨论区各种数据都过了,甚至怀疑输入有问题,但看到gets也可以过,难道是思路错了?

    题意:V表示ture,F表示false,然后有三种位运算符‘!’、‘&’、'|'。其中'!'的优先级最高,‘|’的优先级最低。即优先级关系:! > & > | 。给你一串包含这些运算符的表达式当然了还有括号,要你判断最终结果是VorF。

    先说说我的思路吧:符号栈和数值栈肯定是前提(数组模拟也无所谓)。由于‘!’和‘&’的运算等级较高,于是我们可以先把所有的‘!’和‘&’先进行运算,最后运算或(扫一遍无先后)。当然了,括号的优先级最最高,我们特判括号的情况。你可能要问‘!’和’&‘的优先级有大小,怎么判断先后呢,我们发现’!‘一般是在一个数值前面,当存入一个数值的时候可以直接运算,’&‘在两个数值之间,也是直接取数值栈顶的两个元素直接运算再入栈。就是因为’!‘只能在一个数值前或者括号前(括号内最终也会化为一个数值),所以如果’!‘和’&‘都出现了肯定会将’!‘先运算完再’&‘运算,本来也符合题意优先级之分。但为什么会wa这么多遍呢,next....

    现在来说说括号怎么判,我们如果是出现'('的话直接先入符号栈,然后数值和符号也是直接入相应的栈再判断运算。但当’)‘出现意味着肯定有一个最近的’(‘与其配对,我们这时就要把括号里的先运算完对吧,但上述提到’!‘和’&‘都是一出现就直接运算了,所以这时的括号内只能是单个数值或很多’|‘,还是直接运算,到’(‘就截止了嘛。最后弹出’(‘。好像看起来没毛病,又是WA。原因为何?next.....

    最后看其他人提交的代码结果发现他们根本没有判优先级,三种符号出现都是从左往右扫,这样也过?’!‘的情况肯定没问题,但’&‘和’|‘总得有个先后,一学弟给出一幅图画出单个’&‘和单个’|‘的所有情况让我猜想这样依次运算是否和先后运算的结果一样?草草的证明了一下貌似真的可以(急功近利),然后仿照这大家的思路做了做终于发现自己的问题出在哪了,原来在进行’!‘和’&‘运算的时候没有判断到’(‘应截止。还有在’(‘应当出栈的时候没有判断栈顶元素是否为’(‘。也是神奇,我的正确思路居然被这种样例hackde。这时仍接受着依次运算和先后运算的结果一样的观点,回到宿舍学姐再讨论群里提出这样一组数据:1|0&0 即 V|F&F。这样明显打破上述观点,然后用两种代码都试了试果然依次运算的结果是F,正解应该是V。不得不说自己没有仔细证明为了A题草草下定结论,不过所幸自己的代码是没有问题的。可能大家读题题意没有明确,却阴差阳错,集训队的读题能力貌似一直处于迷离状态。。。。

    重(ji)点(tang):研究性学习真的是让人很兴奋,充分锻炼一个人的耐心与思维,在结论成果得出的那一刻仿佛即将升天般的快感,这种学习方式也值得我们利用,当前学习状态不禁让我想起了快餐文化这一概念,急功近利总不得有好的结果,沉心静气淡泊名利才能走的更远。不惜花了这么大的篇幅来引出这段话,就算个人体验了,不喜勿喷。

    回到原题,下面给出三种代码:

 思路1:WA。未正确判断好括号关系。

const int N=1e6+10;
stack<char>q1;
stack<int>q2;
char s[150];
void ch(char c)
{if(c=='!'){int x1=q2.top();q2.pop();x1=!x1;q2.push(x1);}else if(c=='&'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop(); q2.push(x1&x2);}else if(c=='|'){int x1=q2.top();  q2.pop();int x2=q2.top();  q2.pop();q2.push(x1|x2);}q1.pop();
}
int main()
{int t=1;char c;while(1){c=getchar();if(c==' ') continue;if(c=='\n'||c==EOF){while(!q1.empty()){if(q1.top()!='(') ch(q1.top());else q1.pop();}printf("Expression %d: ",t++);if(q2.top()==1) puts("V");else puts("F");while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();if(c==EOF) break;else continue;}if(c==')'){while(!q1.empty()&&q1.top()!='(') ch(q1.top());q1.pop();//本意是删去‘(’,但应该判断是否为空且栈顶是否为‘(’}else{if(c!='V'&&c!='F') q1.push(c);else{if(c=='V') q2.push(1);else q2.push(0);while(!q1.empty())//应该判断‘(’截止{if(q1.top()!='!'&&q1.top()!='&') break;//‘!’和'&'优先ch(q1.top());}}}}return 0;
}


  代码二:AC。

const int N=1e6+10;
stack<char>q1;
stack<int>q2;
char s[N];
void ch(char c)
{if(c=='!'){int x=q2.top();q2.pop();q2.push(!x);}else if(c=='&'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1&x2);}else if(c=='|'){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1|x2);}q1.pop();
}
int main()
{int t=1;while(gets(s)){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();int len=strlen(s);for(int i=0; i<len; i++){if(s[i]==' ') continue;if(s[i]==')'){while(!q1.empty()&&q1.top()!='(')  ch(q1.top());if(!q1.empty()&&q1.top()=='(') q1.pop();//删去左括号}else{if(s[i]!='F'&&s[i]!='V') q1.push(s[i]);else{if(s[i]=='F') q2.push(0);else q2.push(1);while(!q1.empty()&&q1.top()!='('){if(q1.top()!='&'&&q1.top()!='!') break;ch(q1.top());}if(!q1.empty()&&q1.top()=='(') q1.pop();}}}printf("Expression %d: ",t++);while(!q1.empty()) ch(q1.top());if(q2.top()==1) puts("V");else puts("F");}return 0;
}


  代码三:hacked   V|F&F

const int N=1e3+10;
stack<char>q1;
stack<int>q2;
char s[N];
void deal(char tmp)
{if(tmp==')') q1.pop();else{if(tmp=='V') q2.push(1);else q2.push(0);}while(!q1.empty()&&q1.top()!='('){char c=q1.top();q1.pop();if(c=='!'&&!q2.empty()){int x=q2.top();q2.pop();q2.push(!x);}else if(c=='&'&&q2.size()>1){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1&x2);}else if(c=='|'&&q2.size()>1){int x1=q2.top();q2.pop();int x2=q2.top();q2.pop();q2.push(x1|x2);}}
}
int main()
{int t=1;while(gets(s)){while(!q1.empty()) q1.pop();while(!q2.empty()) q2.pop();int len=strlen(s);for(int i=0; i<len; i++){if(s[i]==' ') continue;if(s[i]=='F'||s[i]=='V'||s[i]==')') deal(s[i]);else q1.push(s[i]);}printf("Expression %d: ",t++);if(!q1.empty()) deal(q1.top());if(q2.top()==1) puts("V");else puts("F");}return 0;
}


转载于:https://www.cnblogs.com/nyist-TC-LYQ/p/7208090.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H264 CAVLC 研究

目录 1 CAVLC概念 2 CAVLC原理 3 CAVLC编码流程 4 CAVLC解码流程 展开全部 1 CAVLC概念 2 CAVLC原理 3 CAVLC编码流程 4 CAVLC解码流程 收起 摘要纠错编辑摘要 CAVLC即基于上下文的自适应变长编码。H.264标准中使用CAVLC对4*4模块的亮度和色度残差数据进行编码。 CAVLC-CAVLC…

【MySQL 】学习笔记千行总结

/* Windows服务 */ -- 启动MySQLnet start mysql -- 创建Windows服务sc create mysql binPath mysqld_bin_path(注意&#xff1a;等号与值之间有空格)/* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES…

CCCC 连续因子

题意&#xff1a; 一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7&#xff0c;其中5、6、7就是3个连续的数字。给定任一正整数N&#xff0c;要求编写程序求出最长连续因子的个数&#xff0c;并输出最小的连续因子序列。 输入格式&#xff1a; 输入在一行…

Mybatis怎么能看是否执行了sql语句

项目需要学习mybatis中&#xff0c;本来mybatis也不是什么新技术&#xff0c;无奈之前没接触过。 验证缓存机制时&#xff0c;需要能看到是否sql被执行了。这就需要增加日志的打印 配置如下 在pom中增加如下依赖&#xff1a; <dependency> <groupId>org.bgee.log4j…

定时备份 MySQL 并上传到七牛

定时备份 MySQL 并上传到七牛 多数应用场景下&#xff0c;我们需要对重要数据进行备份、并放置到一个安全的地方&#xff0c;以备不时之需。 常见的 MySQL 数据备份方式有&#xff0c;直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑…

vue_props div赋值props定义变量 templete获取

vue_props div赋值props定义变量 templete获取 <div id"app"> <add v-bind:btn"h"></add> </div> <script> var vm new Vue({ el: #app, data: { h: "hello" }, components: { "add": { …

H.264句法和语法总结 句法元素的分层结构

在 H.264 定义的码流中&#xff0c;句法元素被组织成有层次的结构&#xff0c;分别描述各个层次的信息&#xff0c;如下图所示 在H.264 中&#xff0c;句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。 在这样的结构中&#xff0c;每一层的头部和它的数据部分形成管…

instanceof 的运用

2019独角兽企业重金招聘Python工程师标准>>> Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出&#xff0c;这个对象是否是这个特定类或者是它的子类的一个实例。 用法&#xff1a; result object i…

R 脚本读取汇总 Excel 表格数据

主要用到了 xlsx 和 rJava 包&#xff0c;打开 Excel 文件&#xff0c;读取各表格数据&#xff0c;再写入到汇总表。 下图为处理前的原始数据表格&#xff1a; 下图为处理后的数据&#xff1a; 代码实现 安装&加载包的函数实现。installed.packages() 函数获取所有已安装…

[Grid Layout] Place grid items on a grid using grid-column and grid-row

It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid-template-columns and grid-template-rows, and to the grid items, we’ll pass grid-column and grid-row some numeric values. <!DOCTYPE html> <html l…

【大数据】最新大数据学习路线(完整详细版,含整套教程)

大数据学习路线 java(Java se,javaweb) Linux(shell,高并发架构,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 机器学习(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

264编码基本概念 FFMpeg的解码流程

下面转自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8楼 1、NAL、Slice与frame意思及相互关系 NAL指网络提取层&#xff0c;里面放一些与网络相关的信息Slice是片的意思&#xff0c;264中把图像分成一帧&#xff08;frame&#xff09;…

谷歌浏览器开发调试工具中Sources面板 js调试等 完全介绍

这次分享的是Chrome开发工具中最有用的面板Sources。 Sources面板几乎是我最常用到的Chrome功能面板&#xff0c;也是在我看来决解一般问题的主要功能面板。通常只要是开发遇到了js报错或者其他代码问题&#xff0c;在审视一遍自己的代码而一无所获之后&#xff0c;我首先就会打…

java XML解析防止外部实体注入

/** * 增加防止部实体注入逻辑* <功能详细描述>* param reader* throws SAXException* see [类、类#方法、类#成员]*/public static void setReaderFeature(SAXReader reader)throws SAXException{reader.setFeature("http://apache.org/xml/features/disallow-doct…

【Python】最新Python学习路线(完整详细版,含整套教程)

python目前应用最广的三个岗位&#xff1a;全栈开发、数据分析、运维开发&#xff0c;今天我们就以这三个重点的岗位来做一下自学Python的规划&#xff0c;希望你在学之前就能有明确的学习方向。 最近开始整理python的资料&#xff0c;博主建立了一个qq群&#xff0c;希望给大家…

程序员,软件测试知多少?

送给初级程序员的测试认知文作为开发同学&#xff0c;一些基本的测试岗位相关知识还是很有必要了解一下&#xff0c;免的某些同学在工作中和测试同学斗嘴、打架、群殴等以及被测试鄙视....。 我们常常听说的一些测试专业术语&#xff0c;比如白盒、黑盒、单元测试&#xff0c;相…

ffmpeg最新源代码(定期更新)

为了方便那些不能连接到ffmpeg的SVN仓库更新源代码的用户&#xff0c;ffmpeg工程组特开辟一个专区&#xff0c;定期更新ffmpeg的源代码&#xff0c;并将其快照上传&#xff0c;有需要的朋友可以长期关注本帖。ffmpeg的编译指令通常为&#xff1a;1、配置&#xff1a;configurat…

vue 入门环境搭建

公司项目要用vue.js来开发&#xff0c;要使用vue来开发前端框架&#xff0c;首先要有环境&#xff0c;所以给大家介绍一下如何搭建vue环境。其实很简单&#xff1a; 1.首先下载安装node.js。 去官网https://nodejs.org/zh-cn/下载安装包。 2.安装webpack 打开cmd命令界面&#…

【解决】Win10修改host没有权限问题

Step1&#xff1a;右键文件选择属性&#xff0c;选择安全&#xff0c;点击编辑&#xff1a; Step2&#xff1a;在弹窗中点击添加&#xff0c;在弹窗中点击高级&#xff1a; Step3&#xff1a;在弹窗中点击立即查找&#xff0c;选中当前用户&#xff0c;点击确定&#xff1a; …

[已授权] 互联网定位技术小谈

​ 诚邀阿里云先知社区邀请&#xff0c;不胜感激&#xff01;今日小编在此为大家介绍一下互联网中所应用的定位技术。互联网的发展日新月异&#xff0c;技术迭代很快&#xff0c;各行各业的智慧在互联网这片蓝天下碰撞结晶&#xff0c;造福大众。今天要讲述的集中定位方式&…