【力扣】1106. 解析布尔表达式(C++/Go 栈的应用)

简介: 【力扣】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 := 0
        f := 0
        for 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'
}
目录
相关文章
|
1天前
|
存储 Java Go
Go 语言切片如何扩容?(全面解析原理和过程)
Go 语言切片如何扩容?(全面解析原理和过程)
12 2
|
1天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
1天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的深度解析
【5月更文挑战第12天】本文将深入探讨Java 8中的两个重要新特性:Lambda表达式和Stream API。我们将从基本概念入手,逐步深入到实际应用场景,帮助读者更好地理解和掌握这两个新特性,提高Java编程效率。
41 2
|
1天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
25 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
1天前
|
供应链 搜索推荐 API
API在电子商务中的应用与优势:深入解析
API是电子商务成功的关键,它们不仅促进了技术创新,还提高了用户体验和运营效率。随着技术的不断进步,API将继续在电子商务领域发挥更加重要的作用。电子商务平台通过利用API,可以更加灵活地适应市场变化,提供更加丰富和个性化的购物体验,最终实现业务的增长和扩展。
|
1天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
1天前
|
Serverless C++ 容器
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
|
1天前
|
C++ 芯片
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
|
1天前
|
编译器 C++
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
|
1天前
|
C++
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】

推荐镜像

更多
http://www.vxiaotou.com