JAVA程序设计:解析布尔表达式(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
 

提示:

1 <= expression.length <= 20000
expression[i] 由 {'(', ')', '&', '|', '!', 't', 'f', ','} 中的字符组成。
expression 是以上述形式给出的有效表达式,表示一个布尔值。

思路:这道题和括号匹配问题很像,我们采用栈模拟的方法, 当遇到右括号时考虑求出该括号内的布尔表达式并将其压入栈中,若括号前为‘!’,则根据括号的的‘t’或者‘f’取反,其余两个类似,按照布尔表达式的规则来就好了。

class Solution {
    public boolean parseBoolExpr(String expression) {

        int len = expression.length();
        Stack<Character> st = new Stack<>();

        for (int i = 0; i < len; i++) {
            if (expression.charAt(i) == '(' || expression.charAt(i)==',') continue;
            else if (expression.charAt(i) == ')') {
                boolean mark_f = false, mark_t = false;
                while (!st.isEmpty() && (st.peek() == 't' || st.peek() == 'f')) {
                    if (st.peek() == 't') mark_t = true;
                    if (st.peek() == 'f') mark_f = true;
                    st.pop();
                }
                char c = st.pop();
                if (c == '!') {
                    if (mark_f) st.add('t');
                    else st.add('f');
                } else if (c == '&') {
                    if (mark_f) st.add('f');
                    else st.add('t');
                } else {
                    if (mark_t) st.add('t');
                    else st.add('f');
                }
            } else
                st.add(expression.charAt(i));
        }

        return st.peek() == 't' ? true : false;

    }
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值