【力扣】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'
}
目录
相关文章
|
18天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
17天前
|
程序员 Go
Golang深入浅出之-Select语句在Go并发编程中的应用
【4月更文挑战第23天】Go语言中的`select`语句是并发编程的关键,用于协调多个通道的读写。它会阻塞直到某个通道操作可行,执行对应的代码块。常见问题包括忘记初始化通道、死锁和忽视`default`分支。要解决这些问题,需确保通道初始化、避免死锁并添加`default`分支以处理无数据可用的情况。理解并妥善处理这些问题能帮助编写更高效、健壮的并发程序。结合使用`context.Context`和定时器等工具,可提升`select`的灵活性和可控性。
27 2
|
3天前
|
存储 设计模式 C语言
C++中的栈和队列
C++中的栈和队列
7 0
|
13天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
13天前
|
网络协议 Java Go
【Go语言专栏】Go语言中的WebSocket实时通信应用
【4月更文挑战第30天】Go语言(Golang)是Google开发的编程语言,适用于云计算、微服务等领域。本文介绍了WebSocket,一种实现浏览器与服务器全双工通信的协议,其特点是实时性、全双工和轻量级。在Go中实现WebSocket,可以使用gorilla/websocket库。示例展示了如何创建服务器端和客户端,实现消息的收发。WebSocket广泛应用于聊天、游戏、通知推送和实时数据同步等场景。学习Go语言中的WebSocket对于开发实时通信应用至关重要。
|
4天前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
5 0
|
6天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
10 0
|
8天前
|
负载均衡 监控 Go
Golang深入浅出之-Go语言中的服务网格(Service Mesh)原理与应用
【5月更文挑战第5天】服务网格是处理服务间通信的基础设施层,常由数据平面(代理,如Envoy)和控制平面(管理配置)组成。本文讨论了服务发现、负载均衡和追踪等常见问题及其解决方案,并展示了使用Go语言实现Envoy sidecar配置的例子,强调Go语言在构建服务网格中的优势。服务网格能提升微服务的管理和可观测性,正确应对问题能构建更健壮的分布式系统。
28 1
|
10天前
|
安全 Go
Golang深入浅出之-Go语言中的并发安全队列:实现与应用
【5月更文挑战第3天】本文探讨了Go语言中的并发安全队列,它是构建高性能并发系统的基础。文章介绍了两种实现方法:1) 使用`sync.Mutex`保护的简单队列,通过加锁解锁确保数据一致性;2) 使用通道(Channel)实现无锁队列,天生并发安全。同时,文中列举了并发编程中常见的死锁、数据竞争和通道阻塞问题,并给出了避免这些问题的策略,如明确锁边界、使用带缓冲通道、优雅处理关闭以及利用Go标准库。
24 5
|
12天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
23 2