leetcode-1106: 解析布尔表达式

简介: 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;
    }
};
相关文章
|
3月前
|
并行计算 Java 程序员
深入解析JDK 8中的Lambda表达式:新特性的力量
本文将深入探讨JDK 8中引入的最引人注目的新特性之一:Lambda表达式。我们将详细解析Lambda表达式的概念、语法和用途,并通过实际示例展示如何利用Lambda表达式简化代码和提高编程效率。
|
2月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
67 1
|
2月前
|
Java 开发者
深入解析Java中的Lambda表达式
本文深入探讨Java编程语言中的Lambda表达式,介绍了Lambda表达式的定义、优势以及在实际开发中的应用场景,旨在帮助读者更好地理解和运用这一特性。
|
2月前
|
JavaScript Java 程序员
Java 8新特性解析:Lambda表达式与函数式编程
【2月更文挑战第12天】 本文深入探讨Java 8引入的两大革命性特性:Lambda表达式和函数式编程接口,旨在为Java开发者提供一个清晰的指南,帮助他们理解和应用这些新特性以提升代码的简洁性和效率。通过对Lambda表达式的基本概念、语法及其与函数式接口的结合使用进行详细分析,本文展示了如何利用这些新特性来编写更加简洁、易读且易于维护的代码。同时,文章还将通过实例探讨Lambda表达式在实际开发中的应用,包括在集合处理、事件监听和并发编程等方面的具体使用场景,以期让读者能够充分理解并有效利用Java 8的这些新工具,从而在日常开发工作中提高效率。
|
3月前
|
并行计算 Java API
Java中的Lambda表达式应用与实例解析
【2月更文挑战第4天】本文将深入探讨Java编程语言中Lambda表达式的应用与实例解析,通过详细介绍Lambda表达式的概念、语法特点以及在实际项目开发中的运用,帮助读者更好地理解和运用这一强大的编程特性。
|
9月前
|
设计模式 Java Spring
这个无敌设计,可以解析并运算任意数学表达式
下面用解释器模式来实现一个数学表达式计算器,包含加、减、乘、除运算。 首先定义抽象表达式角色IArithmeticInterpreter接口。
55 0
|
4月前
|
SQL
leetcode-SQL-1440. 计算布尔表达式的值
leetcode-SQL-1440. 计算布尔表达式的值
31 1
|
5月前
|
编译器 C++
【C++】lambda表达式语法详细解读(代码演示,要点解析)
【C++】lambda表达式语法详细解读(代码演示,要点解析)
|
7月前
|
存储 并行计算 Java
【Java系列】深入解析 Lambda表达式
【Java系列】深入解析 Lambda表达式
49 0
|
7月前
|
算法
6.解析表达式算法
6.解析表达式算法

热门文章

最新文章

推荐镜像

更多