leetcode-1106: 解析布尔表达式

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: leetcode-1106: 解析布尔表达式

题目

题目连接

给你一个以字符串形式表述的 布尔表达式(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

解题

方法一:栈

相当于每个()就进入一个栈

遇到!,|,&后面一定跟着()

然后同时要记录当前栈里面,是否出现t, f

因此可以通过pair来表示一个栈空间内容

其中pair.frist表示 运算符,0,1,2分别表示!,&,|

pair.second表示 状态, 0:表示还没有tf1:表示只有t2:表示只有f3:表示既有t也有f ,也就是说可以理解为int的低位的两位,来表示t或者f是否出现

class Solution {
public:
    bool parseBoolExpr(string expression) {
        stack<pair<int,int>> st;//pair.first  0:!  1:&   2:|    pair.second   0:空  1:只有true  2:只有false  3:有true和false
        st.emplace(1,0);//初始化主栈空间,由于主栈空间只有可能是true或者false,因此用&或者|都行
        for(char c:expression){
            if(c=='!'||c=='|'||c=='&'){//压栈
                if(c=='!') st.emplace(0,0);
                if(c=='|') st.emplace(2,0);
                if(c=='&') st.emplace(1,0);
            }else if(c=='t'){//最低位来记录t出现了
                st.top().second|=1;
            }else if(c=='f'){//到数第二位来记录f出现了
                st.top().second|=2;
            }else if(c=='(') continue;
            else if(c==')'){
                auto [ops,state]=st.top();
                st.pop();
                if(ops==0){//!运算
                    if(state==1) st.top().second|=2;
                    else if(state==2) st.top().second|=1;
                }else if(ops==1){//&运算,出现一个false,就是false
                    if(state==1) st.top().second|=1;
                    else if(state==2||state==3) st.top().second|=2;
                }else if(ops==2){//|运算,出现一个true,就是true
                    if(state==1||state==3) st.top().second|=1;
                    else if(state==2) st.top().second|=2; 
                }
            }
        }
        return st.top().second==1?true:false;
    }
};
相关文章
|
2月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
2月前
|
JSON 数据格式 索引
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
|
3月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
4月前
|
前端开发 安全 Java
Spring EL表达式:概念、特性与应用深入解析
Spring EL表达式:概念、特性与应用深入解析
|
3月前
|
并行计算 Java 开发者
解析Java中的Lambda表达式用法
解析Java中的Lambda表达式用法
|
4月前
|
开发者 Kotlin
Kotlin中List的Lambda表达式应用与解析
Kotlin中List的Lambda表达式应用与解析
|
4月前
|
Java API
深入解析Java中的Lambda表达式
深入解析Java中的Lambda表达式
|
2月前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
2月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
19天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理

推荐镜像

更多
下一篇
无影云桌面