1106. 解析布尔表达式 ------ 使用栈处理带括号表达式、switch case
给你一个以字符串形式表述的 布尔表达式(boolean) expression,返回该式的运算结果。
有效的表达式需遵循以下约定:
"t",运算结果为 True
"f",运算结果为 False
"!(expr)",运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
"&(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 与的运算(AND)
"|(expr1,expr2,...)",运算过程为对 2 个或以上内部表达式 expr1, expr2, ... 进行逻辑 或的运算(OR)
示例 1:
输入:expression = "!(f)"
输出:true
示例 2:
输入:expression = "|(f,t)"
输出:true
示例 3:
输入:expression = "&(t,f)"
输出:false
示例 4:
输入:expression = "|(&(t,f,t),!(t))"
输出:false
提示:
1 <= expression.length <= 20000
expression[i] 由 {'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
expression 是以上述形式给出的有效表达式,表示一个布尔值。
class Solution { public: bool parseBoolExpr(string expression) { stack<char>stk; // 声明一个栈,使用栈处理 带有()的运算十分简便 for (int i = 0;i < expression.size();i++){ // 对字符串进行遍历 char token = expression[i]; if (token == ','){ // 如果字符为 “,” 则跳过该逗号 continue; } else if (token != ')'){ // 只要字符不是‘ )’ 就push压入栈 stk.push(token); } else{ // 如果字符为 ) 说明一个带括号的 bool 表达式已经全部入栈 int t = 0, f = 0; // 设置计数器记录 t 和 f 字符出现的次数 while (stk.top() != '('){ // 检查栈顶元素,如果不是( 那么进行接下来的操作 char value = stk.top(); if (value == 't'){ // 检查是否为 t 是就++ t++; } if (value == 'f'){ // 检查是否为 f 是就++ f++; } stk.pop();// pop出栈该元素 } // 栈顶元素为( 时,说明括号内元素已经检查完毕,退出循环 stk.pop(); // 先出栈( char op = stk.top(); // 括号外 是bool表达式的操作符operator stk.pop(); // 出栈这个操作符 switch(op){ // 分别对“取反符号!”、“与符号&”、“或符号|”进行操作 case'!': stk.push(f == 1? 't' : 'f'); // 当 只有一个f时,取t break; case'&': stk.push(f == 0? 't' : 'f'); // 当没有f时(全是t),取t break; case'|': stk.push(t == 0? 'f' : 't'); // 当没有t时(全是f),取f break; defult: break; } } } return stk.top() == 't'; // 最后要输出一个判断 bool值 } };
hello my world
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16861016.html