[递归和栈] Boolean Expressions

描述

The objective of the program you are going to produce is to evaluate boolean expressions as the one shown next:

Expression: ( V | V ) & F & ( F | V )


where V is for True, and F is for False. The expressions may include the following operators: ! for not , & for and, | for or , the use of parenthesis for operations grouping is also allowed.

To perform the evaluation of an expression, it will be considered the priority of the operators, the not having the highest, and the or the lowest. The program must yield V or F , as the result for each expression in the input file.

输入

The expressions are of a variable length, although will never exceed 100 symbols. Symbols may be separated by any number of spaces or no spaces at all, therefore, the total length of an expression, as a number of characters, is unknown.

The number of expressions in the input file is variable and will never be greater than 20. Each expression is presented in a new line, as shown below.

输出

For each test expression, print "Expression " followed by its sequence number, ": ", and the resulting value of the corresponding test expression. Separate the output for consecutive test expressions with a new line.

Use the same format as that shown in the sample output shown below.

样例输入

( V | V ) & F & ( F| V)
!V | V & V & !F & (F | V ) & (!F | F | !V & V)
(F&F|V|!V&!F&!(F|F&V))

样例输出

Expression 1: F
Expression 2: V
Expression 3: V
解题分析

其实这种表达式的求值可以用两个栈的做法来做,而且某种程度上也更符合思维的一个逻辑。首先,我们定义两个栈来辅助我们表达式的计算,一个栈用来存储数值,一个栈用来存储运算符。接着,我们开始遍历整个表达式,如果遇见了正括号,我们往运算符的栈里扔一个0,如果遇见了反括号,我们先判断栈里有没有元素以及上一个运算符是不是0(如果是0说明我们在上面的运算过程中没有&或者|运算需要我们去处理,所以不用calculate),否则调用calculate函数不断地计算括号里面的值。最后,我们重新insert一下防止括号外边有一些!运算符。当我们遇见"!"的时候,往符号运算符栈里面扔3,当我们遇见&的时候,这个时候我们可以先计算一下同级的&运算符了,然后再往符号运算符里面扔2,同理当我们遇见|的时候,这个时候我们可以先计算一下同级的|运算符了,然后再往符号运算符里面扔1,遇见'F'和'V'的时候,直接往值运算栈里面扔0/1即可。在这样一个双栈过程中,我们确保了!运算符优先级最高,&第二,|第三。最后,我们看看符号运算栈里还有没有元素,如果有的话继续计算即可。

代码实现
#include <iostream>
#define MAXN 110
using namespace std;
int val[MAXN],op[MAXN],vtop=0,otop=0;void insert(int x){while(otop && op[otop-1]==3){x=!x; otop--;}val[vtop++]=x;
}void calculate(){int a=val[--vtop];int b=val[--vtop];int c=op[--otop];if(c==2) insert(a&b);else insert(a|b);
}int main(){string s;int t=0;while(getline(cin,s)){t++;otop=vtop=0;int lens=s.size();for(int i=0;i<lens;i++){switch (s[i]) {case '(':op[otop++]=0;break;case ')':while(otop && op[otop-1]!=0) calculate();--otop;insert(val[--vtop]);break;case '!':op[otop++]=3;break;case '&':while(otop && op[otop-1]>=2) calculate();op[otop++]=2;break;case '|':while(otop && op[otop-1]>=1) calculate();op[otop++]=1;break;case 'V':insert(1);break;case 'F':insert(0);break;default:break;}}while(otop) calculate();cout<<"Expression "<<t<<": "<<(val[0]?'V':'F')<<endl;}return 0;
}

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

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

相关文章

061、Python 包:模块管理

包&#xff08;Package&#xff09;是一种用于组织模块的层次结构。包实际上就是一个包含了__init__.py文件的目录&#xff0c;该文件可以为空或包含包的初始化代码。通过使用包&#xff0c;可以更好地组织和管理大型项目中的模块&#xff0c;避免命名冲突&#xff0c;并提高代…

Hadoop+Spark大数据技术(自命题试卷测试)

试卷一 一、选择题 (每小题2分&#xff0c;共20分) 1. Hadoop 核心组件包括&#xff1a; A. HDFS 和 Hive B. HDFS 和 MapReduce C. HBase 和 Spark D. YARN 和 ZooKeeper 2. HDFS 数据块存储方式的优势不包括&#xff1a; A. 文件大小不受单一磁盘大小…

kettle从入门到精通 第七十一课 ETL之kettle 再谈http post,轻松掌握body中传递json参数

场景&#xff1a; kettle中http post步骤如何发送http请求且传递body参数&#xff1f; 解决方案&#xff1a; http post步骤中直接设置Request entity field字段即可。 1、手边没有现成的post接口&#xff0c;索性用python搭建一个简单的接口&#xff0c;关键代码如下&#…

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

可提供实习证明/实习鉴定报告,企业项目试岗实训开营啦

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

如何编辑和修改ROM,快速上手

编辑和修改ROM是一个相对复杂的过程&#xff0c;需要一定的技术知识和准备。以下是编辑和修改ROM的详细步骤&#xff0c;供您参考&#xff1a; 一、准备工作 准备一台可root的安卓手机&#xff0c;并确保手机已解锁bootloader。 在电脑上下载并安装ADB&#xff08;Android De…

关于lamda表达式的使用

Lambda表达式是一种匿名函数,即没有函数名的函数,它可以以更简洁、更灵活的方式编写代码。以下是Lambda表达式的常用方式: 无参数,无返回值: 如果抽象方法不带参数且不返回值,可以使用空括号和主体编写Lambda表达式。例如:() -> System.out.println(“Hello, World!…

力扣(2024.06.18)

1. 39——组合总和 给你一个无重复元素的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有不同组合&#xff0c;并以列表形式返回。你可以按任意顺序返回这些组合。candidates 中的同一个数字可以无限制重复被选…

CentOS更新镜像源

0、背景 Linux下安装很多指令或者工具时&#xff0c;发现yum执行超时或者返回没找到有效的package&#xff0c;此时需要更新yum源 Yum&#xff08;Yellowdog Updater Modified&#xff09;是一种在 Linux 操作系统中用于软件包管理的工具 Yum 源就是存储那些软件包及其相关信息…

在 KubeSphere 上快速安装和使用 KDP 云原生数据平台

作者简介&#xff1a;金津&#xff0c;智领云高级研发经理&#xff0c;华中科技大学计算机系硕士。加入智领云 8 余年&#xff0c;长期从事云原生、容器化编排领域研发工作&#xff0c;主导了智领云自研的 BDOS 应用云平台、云原生大数据平台 KDP 等产品的开发&#xff0c;并在…

基因名写作的规范

基因名写作的规范通常会因物种和领域的不同而有所变化&#xff0c;但以下是一些通用的指导原则&#xff1a; 斜体表示基因名&#xff1a;在论文和其他科学文献中&#xff0c;基因名通常用斜体书写。例如&#xff0c;villin2 应该写作 villin2。 大小写&#xff1a; 对于真核生…

联邦学习周记|第四周

论文&#xff1a;Active Federated Learning 链接 将主动学习引入FL&#xff0c;每次随机抽几个Client拿来train&#xff0c;把置信值低的Client概率调大&#xff0c;就能少跑几次。 论文&#xff1a;Active learning based federated learning for waste and natural disast…

安装docker版mongodb 6并设置时区、容器内存大小

本文以mongodb6为例&#xff0c;讲解如何在Ubuntu22.04上的docker中安装mongodb6。 一、环境准备 系统 Ubuntu22.04 docker 26.1.4二、安装mongodb6 拉取镜像&#xff08;下文都以root用户执行命令&#xff09;&#xff1a; docker pull mongo:6.0.6创建docker compose配置…

“Git之道:掌握常用命令,轻松管理代码“

目录 1. 初始化和配置 2. 提交和更新 3. 分支和合并 4. 查看和比较 5. 远程仓库 6. 文件操作命令 1. 初始化和配置 git init&#xff1a;在当前目录初始化一个新的Git仓库git config&#xff1a;配置Git的全局或局部选项git clone&#xff1a;从远程仓库克隆一个本地副本…

vue3第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分&#xff0c;经常用到的是 store、state、getters、actions 以下使用说明&#xff0c;注意事项&#xff0c;仅限于 vue3 setup 语法糖中使用&#xff0c;若使用选项式 API 请直接查看官方文档&#xff1a; 一、前言&#xff1a; pinia 是为了探索 vu…

微信小程序-路由和页面跳转API

一.wx.navigateTo wx.navigateTo是通过编程实现页面跳转&#xff0c;和navigator组件组件中&#xff0c;open-type"navigate"属性类似&#xff0c;是保留当前页面跳转新的页面&#xff0c;不适用tabbar页面。 //保留当前页面&#xff0c;跳转到非tabbar页面wx.navig…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-11暂退法Dropout

11暂退法Dropout #Dropout 是一种正则化技术&#xff0c;主要用于防止过拟合&#xff0c; #通过在训练过程中随机丢弃神经元来提高模型的泛化能力。 import torch from torch import nn from d2l import torch as d2l import liliPytorch as lpdef dropout_layer(X, dropout):…

大数据—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍 四大名著&#xff0c;又称四大小说&#xff0c;是汉语文学中经典作品。这四部著作历久不衰&#xff0c;其中的故事、场景&#xff0c;已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平&#xff0c;细致的刻画和所蕴含的思想都为历代读者所…

MySQL WHERE子句的使用和优化方法

MySQL是一种流行的关系型数据库管理系统&#xff0c;其中WHERE子句是用于过滤数据的重要部分。通过使用WHERE子句&#xff0c;可以根据指定的条件从表中选择特定的数据行。本文将总结MySQL WHERE子句的使用和优化方法&#xff0c;帮助读者更好地理解和应用WHERE子句&#xff0c…

0元体验苹果macOS系统,最简单的虚拟机部署macOS教程

前言 最近发现小伙伴热衷于在VMware上安装体验macOS系统&#xff0c;所以就有了今天的帖子。 正文开始 首先&#xff0c;鉴于小伙伴们热衷macOS&#xff0c;所以小白搜罗了一圈macOS系统&#xff0c;并开启了分享通道。 本次更新的系统版本是&#xff1a; macOS 10.13.6 ma…