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;
    }
};
相关文章
|
1月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
3月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
4月前
|
SQL 开发框架 前端开发
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
在C#开发中使用第三方组件LambdaParser、DynamicExpresso、Z.Expressions,实现动态解析/求值字符串表达式
|
3月前
|
JSON 数据格式 索引
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?
|
5月前
|
前端开发 安全 Java
Spring EL表达式:概念、特性与应用深入解析
Spring EL表达式:概念、特性与应用深入解析
|
4月前
|
并行计算 Java 开发者
解析Java中的Lambda表达式用法
解析Java中的Lambda表达式用法
|
5月前
|
开发者 Kotlin
Kotlin中List的Lambda表达式应用与解析
Kotlin中List的Lambda表达式应用与解析
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多