文章目录

  • 1. 题目
  • 2. 解题

1. 题目

https://tianchi.aliyun.com/oj/245679029019779851/254275128279634588

给定一个字符串代表一个仅包含"true","false","or","and"的布尔表达式。
你的任务是将这个表达式的值求出,返回"true"或"false"
如果该表达式是错误的,则返回"error"

数据保证表达式中只含有"true",“false”,“or”,"and"四种字符串。
表达式中的元素不会超过10000个。

示例
样例 1
输入:
"true and false"
输出:
"false"样例 2
输入:
"true or"
输出:
"error"

2. 解题

  • 先检查是否是合法表达式,首尾只能是 bool,中间不能有连续的 操作符
  • 在用栈记录 bool 值,遇到 and 时,当前 bool 与栈顶 bool 操作,再把结果入栈
  • 遇到 or 直接把 bool 值入栈
  • 最后栈内的 bool 全部做 or 运算
class Solution {public:/*** @param expression: a string that representing an expression* @return: the result of the expression*/string evaluation(string &exp) {// write your code hereexp += ' ';string prev, cur;unordered_set<string> s1 = {"true", "false"},s2 = {"or", "and"};for(int i = 0; i < exp.size(); i++) {if(exp[i] != ' ')cur += exp[i];else{if((prev=="" || i==exp.size()-1) && (cur=="and" || cur=="or"))return "error";//首尾是操作符if((s1.count(prev)&&s1.count(cur))||(s2.count(prev)&&s2.count(cur)))return "error";//连续的操作数,或者连续的操作符prev = cur;cur = "";}}stack<bool> stk;prev = cur = "";for(int i = 0; i < exp.size(); i++) {if(exp[i] != ' ')cur += exp[i];else{if(prev=="" || prev=="or")stk.push(cur=="true" ? true : false);else if(prev == "and"){bool tp = stk.top();stk.pop();stk.push(tp&&(cur=="true" ? true : false));}prev = cur;cur = "";}}bool ans = stk.top();stk.pop();while(!stk.empty() && ans==false){ans = ans||stk.top();stk.pop();}return ans ? "true" : "false";}
};

50ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

天池 在线编程 布尔表达式求值(栈)相关推荐

  1. 【组队学习】【34期】阿里云天池在线编程训练营

    阿里云天池在线编程训练营 航路开辟者:陈信达.杨世超.赵子一.马燕鹏 领航员:武帅.初晓宇.叶前坤.邱广坤.朱松青 航海士:宁彦吉.肖桐.汪超.陈信达.杨世超.赵子一.武帅.初晓宇.叶前坤.邱广坤.朱 ...

  2. POJ 2106 Boolean Expressions (布尔表达式求值)

    题意:关于!,&,| 的运算,表达式中V代表true,F代表false. 思路:见代码吧,很详细了. 要注意 !!!F,!(...) 的情况. #include <iostream> ...

  3. 天池 在线编程 删除字符(单调栈)

    文章目录 1. 题目 2. 解题 1. 题目 描述 给定一个字符串str,现在要对该字符串进行删除操作, 保留字符串中的 k 个字符且相对位置不变,并且使它的字典序最小,返回这个子串. 示例 例1: ...

  4. 天池 在线编程 放小球(动态规划)

    文章目录 1. 题目 2. 解题 2.1 动态规划 1. 题目 n 个桶中小球的个数已知, 可以操作 k 次(每次从桶中取出一个球,或者添加一个球), 每个桶有规定的最大容量 W[i]. 求操作后两相 ...

  5. 天池在线编程 2020年9月26日 日常周赛题解

    文章目录 1. K步编辑 2. 折纸 3. 字符串的不同排列 4. 硬币排成线 题目地址,请点这 1. K步编辑 给出一个只含有小写字母的字符串的集合以及一个目标串(target),输出所有可以经过不 ...

  6. 天池 在线编程 最长AB子串(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s ...

  7. 天池 在线编程 回文子串(区间动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 描述 小明喜欢玩文字游戏,今天他希望在一个字符串的子串中找到回文串. 回文串是从左往右和从右往左读相同的字符串,例如121和tacocat.子串是一个字符 ...

  8. 天池 在线编程 订单分配(回溯)

    文章目录 1. 题目 2. 解题 1. 题目 描述 打车派单场景, 假定有N个订单,待分配给N个司机. 每个订单在匹配司机前,会对候选司机进行打分,打分的结果保存在N*N的矩阵score,其中scor ...

  9. 天池 在线编程 排名查询

    文章目录 1. 题目 2. 解题 1. 题目 描述 给一个二维数组scores表示每个学生的各科成绩,求出学生中总成绩排名第K的索引. 如果成绩一样,越早出现的排名越高. 0 <= scores ...

最新文章

  1. centos创建vsftpd虚拟用户
  2. 【每日随笔】电子签名 ( 下载 “e 签保“ 应用 | 使用 手机号 + 短信验证码 登录 | 发起签署 | 签名 | 获取签名后的 PDF 文件及出证信息 )
  3. php 解析 saml协议,解出SAMLRequest的代码示例
  4. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
  5. java8 nio_Java8之 NIO的学习
  6. Android 系统性能优化(72)-----App启动优化
  7. 字典写入excel_Excel中“先出式”出货的问题,以后出库太方便了
  8. Win10正式版激活方法有哪些?如何激活Win10?
  9. 微信小程序----实现YDUI的ScrollNav组件(滚动导航)
  10. 台式计算机拆卸步骤,拆装台式电脑主机的方法图解步骤
  11. 大数据计算技术架构解析
  12. Roaring BitMap(高效压缩位图)
  13. 51单片机霍尔测速与PWM调直流电机转速快慢
  14. 书论55 郝经《移诸生论书法书》
  15. Web前端:中国环宇科技有限公司网页设计
  16. 【更新21.02.03】百分浏览器继续使用Flash Player的临时解决方案!
  17. stm32 cubemx 新建项目一直报错的问题终于解决了
  18. 人人都会设计模式---建造者模式--Builder
  19. 特斯拉使用顶级编程语言创建自动驾驶汽车
  20. [论文学习笔记]01一种轮廓平行扫描算法【3D打印路径规划】

热门文章

  1. python cross val score_sklearn函数:cross_val_score(交叉验证评分)
  2. linux驱动 cdev,inode结构体
  3. boost Mutex
  4. android pss内存,如何释放android系统中pss cache住的内存
  5. Java IO/NIO教程
  6. centos7装单机hadoop2.7.3
  7. [HDU5215]Cycle
  8. PL/SQL包(Package)
  9. 腾讯云安全组规则导出
  10. android简单的夜间模式