【Leetcode】1106. Parsing A Boolean Expression

news/2024/7/8 7:19:38

题目地址:

https://leetcode.com/problems/parsing-a-boolean-expression/

给定一个表达式,该表达式是个类似于前缀表达式的布尔表达式,其中't'代表true,'f'代表false,其定义是递归的:
1、单个't'或者'f'是个表达式;
2、如果expr是个表达式,则'!(expr)''&(expr,expr,...)''|(expr,expr,...)'都是个表达式。
求该表达式的值。

思路和表达式求值类似,只不过这里不需要考虑优先级的问题。开两个栈,一个存操作数(即't''f')以及左括号'('(这是因为要标记一下做运算的操作数是哪些),另一个存操作符(即'!''&''|')。遇到逗号则直接跳过。遇到右括号的时候开始计算,先pop出操作符和一个操作数,如果操作符是'!',则直接将那个操作数取非入操作数栈(当然要先把左括号pop掉再入栈);如果操作符是另外两个,则将操作数的最上面的左括号之上的所有数进行那个运算,再pop出左括号,再将计算结果入栈。最后操作数栈内就保存了运算答案。代码如下:

import java.util.ArrayDeque;
import java.util.Deque;

public class Solution {
    public boolean parseBoolExpr(String expression) {
        Deque<Character> ops = new ArrayDeque<>(), stk = new ArrayDeque<>();
        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            if (ch == ',') {
                continue;
            }
            
            if (ch == '&' || ch == '|' || ch == '!') {
                ops.push(ch);
            } else if (ch == '(' || ch == 't' || ch == 'f') {
                stk.push(ch);
            } else {
                // ch == ')'
                char op = ops.pop(), x = stk.pop();
                if (op == '!') {
                    stk.pop();
                    stk.push(x == 't' ? 'f' : 't');
                } else {
                    boolean cur = x == 't';
                    while (stk.peek() != '(') {
                        if (op == '&') {
                            cur &= stk.pop() == 't';
                        } else {
                            cur |= stk.pop() == 't';
                        }
                    }
                    
                    // pop掉左括号
                    stk.pop();
                    stk.push(cur ? 't' : 'f');
                }
            }
        }
        
        return stk.peek() == 't';
    }
}

时空复杂度 O ( n ) O(n) O(n) n n n是表达式长度。


http://www.niftyadmin.cn/n/3641949.html

相关文章

通过与Java的比较,迅速掌握Groovy

Groovy轻松入门——通过与Java的比较&#xff0c;迅速掌握Groovy &#xff08;更新于2008.10.18&#xff09; 在前几篇文章中&#xff0c;我已经向大家介绍了Groovy是什么&#xff0c;学习Groovy的重要性等内容&#xff0c;还不了解Groovy的朋友不妨去看看我Blog中的 Groovy分类…

Test Manager之添加需求类型工作项

Test Manager 在创建套件的时候&#xff0c;会添加要求&#xff0c;这个地方只能添加需求。有时我们的工作项可能不叫需求&#xff0c;那么此时直接添加是无法添加的。我们可以通过配置进行实现。 1、进入服务器 2、允许输入cmd 3、 64位进入&#xff0c;cd C:\Program Files (…

【Leetcode】1323. Maximum 69 Number

题目地址&#xff1a; https://leetcode.com/problems/maximum-69-number/ 给定一个只含666和999的十进制数nnn&#xff0c;最多允许将其中一个666改为999&#xff08;允许不改&#xff09;&#xff0c;问能得到的最大数是几。 显然要改最高的666&#xff0c;如果全是999则不…

基于金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理

Git&#xff0c;这货堪称神器&#xff0c;用了它就再也不想用其他VCS了&#xff0c;就像上了高速就不想再走国道一样。 Git的强大之处在于&#xff0c;你可以在局域网内的任何一个共享路径下创建仓库&#xff0c;而不需要运行任何服务。所有的操作都是基于本地的。这也不难理解…

【Leetcode】1309. Decrypt String from Alphabet to Integer Mapping

题目地址&#xff1a; https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/ 给定一个长nnn的加密过的字符串&#xff0c;其原文是个只含小写英文字母的串&#xff0c;加密方式是&#xff0c;将a变为1&#xff0c;b变为2&#xff0c;等等&#x…

我们需要不断进步,工作需要不断重构

我们需要不断进步进入新的公司已经快4个月了&#xff0c;从一开始就感觉这里的人都不错&#xff0c;比较和善&#xff0c;也比较喜欢技术&#xff0c;用一句话说“这是一个程序员的团队”。当时顶着很大的压力&#xff0c;拒绝了一个据说平均年薪20W的公司&#xff0c;选择呆在…

【Leetcode】1732. Find the Highest Altitude

题目地址&#xff1a; https://leetcode.com/problems/find-the-highest-altitude/ 给定一个长nnn数组AAA&#xff0c;求其前缀和数组的最大值&#xff08;前缀和数组里含长度为000的前缀&#xff09;。 代码如下&#xff1a; public class Solution {public int largestAl…

jdk- tomcat - mysql一键安装

jdk tomcat mysql一键安装包SHOP JTM V2.0 简体中文免费版SHOP JTM V2.0【基本介绍】一、什么是 JTM JTM是Win32下绿色的JDK Tomcat MySQL环境集成包。通过JTM用户无需对JDK、Tomcat、 MySQL进行任何安装和配置即可迅速搭建支持JSP MySQL的服务器运行环境。二…