题目链接

题意

给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。

有效的表达式需遵循以下约定:

“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)

思路

类似于表达式求值的题目,用栈来求解。
遍历字符串,

  • 如果当前字符是逗号的话,跳过;
  • 如果当前字符不是右括号,将该字符添加到栈里;
  • 如果是右括号,说明要求值了。遍历前面的字符直到遇到左括号,记录t,f的个数。再根据运算符分类讨论。
  1. 运算符为!。当f的个数为1时,结果才为t;其余结果为f
  2. 运算符为&。当f的个数为0时,结果才为t;其余结果为f
  3. 运算符为|。当t的个数为0时,结果才为f;其余结果为t
    将结果放入栈里
  • 遍历完成后,如果栈顶字符为t说明表达式值为true

代码

class Solution {public:bool parseBoolExpr(string expression) {stack<char>stk;for(int i=0;i<expression.size();i++){if(expression[i]==','){continue;}else if(expression[i]!=')'){stk.push(expression[i]);}else{int t=0,f=0;while(stk.top()!='('){if(stk.top()=='t') t++;else f++;stk.pop();}stk.pop();char op = stk.top();stk.pop();if(op=='!'){if(f==1) stk.push('t');else stk.push('f');}else if(op=='&'){if(f==0) stk.push('t');else stk.push('f');}else if(op=='|'){if(t==0) stk.push('f');else stk.push('t');}}}return stk.top()=='t' ;}
};
func parseBoolExpr(expression string) bool {stk := []rune{}for _,val := range expression {if val == ','{continue}if val != ')' {stk=append(stk,val)continue}t := 0f := 0for stk[len(stk)-1] != '(' {ch := stk[len(stk)-1]if ch == 't' {t++}else{f++}stk = stk[:len(stk)-1]}    stk = stk[:len(stk)-1]op := stk[len(stk)-1]stk = stk[:len(stk)-1]if op == '!' {if f == 1 {stk = append(stk, 't')}else{stk = append(stk, 'f')}}else if op == '&' {if f == 0 {stk = append(stk, 't')}else{stk = append(stk, 'f')}   }else if op == '|' {if t == 0 {stk = append(stk, 'f')}else{stk = append(stk, 't')}   }}return stk[len(stk)-1] == 't'
}

【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)相关推荐

  1. 1106. 解析布尔表达式 DFS

    1106. 解析布尔表达式 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为  ...

  2. Leetcode编程C++之1106. 解析布尔表达式

    Leetcode编程C++之1106. 解析布尔表达式 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: " ...

  3. 力扣:1106. 解析布尔表达式

    给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True "f&q ...

  4. 【1106. 解析布尔表达式】

    来源:力扣(LeetCode) 描述: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t", ...

  5. 1106. 解析布尔表达式

    题目: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True " ...

  6. 珍宝鸭的力扣练习(14):栈操作合集

    通用方法:辅助栈 考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列.根据是否模拟成功,即可得到结果. 题目合集: 题目1:栈的压入.弹出序列 题目2: 双栈实现队列 ) 题目1:栈的压 ...

  7. 力扣20题 有效的括号(栈、哈希表)

    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 每个右括号都 ...

  8. 最详细的力扣sql解析

    https://leetcode-cn.com/problemset/database/ 题目都是leetcode 上了可以点击题目会有相应的链接 由于个人比较喜欢用开窗函数,所以都优先用了开窗 ,当 ...

  9. [力扣刷题总结](栈和单调栈篇)

    文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...

最新文章

  1. OpenCV——简易图形画法:画奥运五环
  2. Oracle 同义词的创建及其作用
  3. IIS下配置php运行环境
  4. java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
  5. 【2016.4.6】结对编程 第二章 基础设计
  6. Python3调用新浪微博API抓取数据
  7. 神经网络ANN——SPSS实现
  8. 扁平化设计的流行配色方案
  9. CameraRaw升级
  10. 微软中国艰难前行:业绩遭遇连续跳票
  11. 尝试解析DDS格式纹理文件的基本信息(不包括图像数据)
  12. 研发部软件开发国家标准
  13. Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
  14. 自己封装的数据库DbUtils的万能模板
  15. 深入探讨Unity协程及其使用
  16. 第33篇:DNS劫持攻击原理讲解及溯源分析的常规步骤
  17. python 获取当前运行的DCC工具
  18. 文件压缩支付加密方式
  19. 算法成长之路------CF22A Second Order Statistics
  20. 区块链界的微信BTchat链语横空出世,它是什么鬼?

热门文章

  1. python 代理ip
  2. 父子沟通实用手册 [作者:宝贝爱无忧2007-1]
  3. Mac 删除 launchpad 上图标
  4. BeautifulReport测试报告的bootstrap文件失效(404)
  5. 无需纠结怎样抠图,这三个方法可以让你一秒换背景
  6. vivado-vscode 新手使用说明 - verilog
  7. web前端之千牛网首页仿写
  8. CMC5401-M4PLUS 基于TC6014的四轴运动控制器的手轮驱动
  9. 你招聘设计师时都问哪些问题?你是怎么招聘设计师大牛的?
  10. 微软和苹果笔记本键盘对比_看看微软,谷歌和苹果的平面设计方法