【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)
题目链接
题意
给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)
思路
类似于表达式求值的题目,用栈来求解。
遍历字符串,
- 如果当前字符是逗号的话,跳过;
- 如果当前字符不是右括号,将该字符添加到栈里;
- 如果是右括号,说明要求值了。遍历前面的字符直到遇到左括号,记录
t
,f
的个数。再根据运算符分类讨论。
- 运算符为
!
。当f
的个数为1时,结果才为t
;其余结果为f
- 运算符为
&
。当f
的个数为0时,结果才为t
;其余结果为f
- 运算符为
|
。当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 栈的应用)相关推荐
- 1106. 解析布尔表达式 DFS
1106. 解析布尔表达式 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 ...
- Leetcode编程C++之1106. 解析布尔表达式
Leetcode编程C++之1106. 解析布尔表达式 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: " ...
- 力扣:1106. 解析布尔表达式
给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True "f&q ...
- 【1106. 解析布尔表达式】
来源:力扣(LeetCode) 描述: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t", ...
- 1106. 解析布尔表达式
题目: 给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果. 有效的表达式需遵循以下约定: "t",运算结果为 True " ...
- 珍宝鸭的力扣练习(14):栈操作合集
通用方法:辅助栈 考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列.根据是否模拟成功,即可得到结果. 题目合集: 题目1:栈的压入.弹出序列 题目2: 双栈实现队列 ) 题目1:栈的压 ...
- 力扣20题 有效的括号(栈、哈希表)
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 每个右括号都 ...
- 最详细的力扣sql解析
https://leetcode-cn.com/problemset/database/ 题目都是leetcode 上了可以点击题目会有相应的链接 由于个人比较喜欢用开窗函数,所以都优先用了开窗 ,当 ...
- [力扣刷题总结](栈和单调栈篇)
文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...
最新文章
- OpenCV——简易图形画法:画奥运五环
- Oracle 同义词的创建及其作用
- IIS下配置php运行环境
- java dos 菜单栏_学习java之电脑的常用快捷键和DOS窗口下的常用命令
- 【2016.4.6】结对编程 第二章 基础设计
- Python3调用新浪微博API抓取数据
- 神经网络ANN——SPSS实现
- 扁平化设计的流行配色方案
- CameraRaw升级
- 微软中国艰难前行:业绩遭遇连续跳票
- 尝试解析DDS格式纹理文件的基本信息(不包括图像数据)
- 研发部软件开发国家标准
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- 自己封装的数据库DbUtils的万能模板
- 深入探讨Unity协程及其使用
- 第33篇:DNS劫持攻击原理讲解及溯源分析的常规步骤
- python 获取当前运行的DCC工具
- 文件压缩支付加密方式
- 算法成长之路------CF22A Second Order Statistics
- 区块链界的微信BTchat链语横空出世,它是什么鬼?