首页 > 其他分享 >2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr

时间:2023-07-19 21:33:04浏览次数:41  
标签:Info index false next exp ans judge true 表达式

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式

有效的表达式需遵循以下约定:

't',运算结果为 true

'f',运算结果为 false

'!(subExpr)',运算过程为对内部表达式 subExpr 进行 逻辑非(NOT)运算

'&(subExpr1, subExpr2, ..., subExprn)'

运算过程为对 2 个或以上内部表达式

subExpr1, subExpr2, ..., subExprn 进行 逻辑与(AND)运算

'|(subExpr1, subExpr2, ..., subExprn)'

运算过程为对 2 个或以上内部表达式

subExpr1, subExpr2, ..., subExprn 进行 逻辑或(OR)运算

给你一个以字符串形式表述的 布尔表达式 expression,返回该式的运算结果。

题目测试用例所给出的表达式均为有效的布尔表达式,遵循上述约定。

输入:expression = "&(|(f))"。

输出:false。

答案2023-07-19:

大体过程如下:

1.主函数main中定义了一个布尔表达式expression为"&(|(f))",该表达式需要计算结果。

2.调用parseBoolExpr函数,并将布尔表达式作为参数传递给它。

3.parseBoolExpr函数中定义了一个内部递归函数f,接收两个参数:表达式字符串exp和当前字符索引index

4.函数f中首先获取当前索引处的字符judge,判断其类型。

5.如果judge为't',返回结果为true,索引保持不变。

6.如果judge为'f',返回结果为false,索引保持不变。

7.如果judge为其他字符,进行进一步判断。

8.如果judge为'!',则递归调用f函数,并将索引加1作为参数,获取递归调用的结果next,对该结果执行逻辑非运算,返回结果为!next.ans,索引更新为next.end + 1

9.如果judge为'&'或'|',则设置布尔变量ans为相应的值(true或false),并在循环中处理多个子表达式。

10.在循环中,当当前字符不是')'时,执行以下操作:

- 如果当前字符是',',则将索引加1,跳过逗号字符。

- 否则,递归调用`f`函数,并将当前索引作为参数获取递归结果`next`。

- 根据父表达式的运算符进行相应的逻辑运算,更新布尔变量`ans`的值。

- 更新索引为`next.end + 1`。

11.循环结束后,返回结果为Info{ans, index},其中ans为布尔表达式的计算结果,index为当前索引。

12.返回到parseBoolExpr函数,获取f函数的结果Info,返回Info.ans作为布尔表达式的最终计算结果。

13.输出最终结果。根据给定的表达式"&(|(f))",计算结果为false,打印结果false。

时间复杂度:假设表达式字符串的长度为n,递归过程涉及到遍历字符串中的每个字符,因此时间复杂度为O(n)。

空间复杂度:递归调用过程中会使用额外的栈空间来保存递归的状态,最坏情况下递归的深度可以达到n,因此空间复杂度为O(n)。

go完整代码如下:

package main

import (
	"fmt"
)

type Info struct {
	ans bool
	end int
}

func parseBoolExpr(expression string) bool {
	return f([]rune(expression), 0).ans
}

func f(exp []rune, index int) Info {
	judge := exp[index]
	if judge == 'f' {
		return Info{false, index}
	} else if judge == 't' {
		return Info{true, index}
	} else {
		var ans bool
		index += 2
		if judge == '!' {
			next := f(exp, index)
			ans = !next.ans
			index = next.end + 1
		} else {
			ans = judge == '&'
			for exp[index] != ')' {
				if exp[index] == ',' {
					index++
				} else {
					next := f(exp, index)
					if judge == '&' {
						if !next.ans {
							ans = false
						}
					} else {
						if next.ans {
							ans = true
						}
					}
					index = next.end + 1
				}
			}
		}
		return Info{ans, index}
	}
}

func main() {
	expression := "&(|(f))"
	result := parseBoolExpr(expression)
	fmt.Println(result)
}

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr_返回结果

rust代码如下:

fn main() {
    let expression = "&(|(f))";
    let result = parse_bool_expr(expression.to_string());
    println!("{}", result);
}

fn parse_bool_expr(expression: String) -> bool {
    let exp: Vec<char> = expression.chars().collect();
    let info = f(&exp, 0);
    info.ans
}

struct Info {
    ans: bool,
    end: usize,
}

fn f(exp: &[char], index: usize) -> Info {
    let judge = exp[index];
    if judge == 'f' {
        return Info {
            ans: false,
            end: index,
        };
    } else if judge == 't' {
        return Info {
            ans: true,
            end: index,
        };
    } else {
        let mut ans: bool;
        let mut index = index + 2;
        if judge == '!' {
            let next = f(exp, index);
            ans = !next.ans;
            index = next.end + 1;
        } else {
            ans = judge == '&';
            while exp[index] != ')' {
                if exp[index] == ',' {
                    index += 1;
                } else {
                    let next = f(exp, index);
                    if judge == '&' {
                        if !next.ans {
                            ans = false;
                        }
                    } else {
                        if next.ans {
                            ans = true;
                        }
                    }
                    index = next.end + 1;
                }
            }
        }
        Info { ans, end: index }
    }
}

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr_字符串_02

c++完整代码如下:

#include <iostream>
#include <string>

using namespace std;

struct Info {
    bool ans;
    // 结束下标!
    int end;

    Info(bool a, int e) {
        ans = a;
        end = e;
    }
};

Info f(const string& exp, int index) {
    char judge = exp[index];
    if (judge == 'f') {
        return Info(false, index);
    }
    else if (judge == 't') {
        return Info(true, index);
    }
    else {
        // !
        // &
        // |
        // 再说!

        bool ans;

        // ! ( ?
        // i i+1 i+2
        // & ( ?
        // i i+1 i+2
        // | ( ?
        // i i+1 i+2
        index += 2;
        if (judge == '!') {
            // ! ( ?...... )
            // i i+1 i+2
            Info next = f(exp, index);
            ans = !next.ans;
            index = next.end + 1;
        }
        else {
            // &
            // i
            // judge == '&' 或者 judge == '|'
            ans = judge == '&';
            while (exp[index] != ')') {
                if (exp[index] == ',') {
                    index++;
                }
                else {
                    Info next = f(exp, index);
                    if (judge == '&') {
                        if (!next.ans) {
                            ans = false;
                        }
                    }
                    else {
                        if (next.ans) {
                            ans = true;
                        }
                    }
                    index = next.end + 1;
                }
            }
        }
        return Info(ans, index);
    }
}

bool parseBoolExpr(const string& expression) {
    return f(expression, 0).ans;
}

int main() {
    string expression = "&(|(f))";
    cout << boolalpha << parseBoolExpr(expression) << endl;
    return 0;
}

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr_布尔表达式_03

c完整代码如下:

#include <stdbool.h>
#include<stdio.h>

typedef struct Info {
    bool ans;
    int end;
} Info;

Info f(char* exp, int index);

bool parseBoolExpr(char* expression) {
    return f(expression, 0).ans;
}

Info f(char* exp, int index) {
    char judge = exp[index];
    Info info;

    if (judge == 'f') {
        info.ans = false;
        info.end = index;
    }
    else if (judge == 't') {
        info.ans = true;
        info.end = index;
    }
    else {
        bool ans;
        index += 2;

        if (judge == '!') {
            Info next = f(exp, index);
            ans = !next.ans;
            index = next.end + 1;
        }
        else {
            ans = judge == '&';

            while (exp[index] != ')') {
                if (exp[index] == ',') {
                    index++;
                }
                else {
                    Info next = f(exp, index);

                    if (judge == '&') {
                        if (!next.ans) {
                            ans = false;
                        }
                    }
                    else {
                        if (next.ans) {
                            ans = true;
                        }
                    }

                    index = next.end + 1;
                }
            }
        }

        info.ans = ans;
        info.end = index;
    }

    return info;
}

int main() {
    char* expression = "&(|(f))";
    bool result = parseBoolExpr(expression);

    printf("%d\n", result);

    return 0;
}

2023-07-19:布尔表达式 是计算结果不是 true 就是 false 的表达式 有效的表达式需遵循以下约定: ‘t‘,运算结果为 true ‘f‘,运算结果为 false ‘!(subExpr_布尔表达式_04

标签:Info,index,false,next,exp,ans,judge,true,表达式
From: https://blog.51cto.com/moonfdd/6780100

相关文章

  • python笔记:第十一章正则表达式
    1.模块re以一定规则,快速检索文本,或是实现一些替换操作默认下,区分大小写2.常见的匹配字符表字符描述\d代表任意数字,就是阿拉伯数字0-9这些\D代表非数字的字符。与\d完全相反\w代表字母,数字,下划线。也就是a-z、A-Z、0-9、_\W跟\w相反,代表不是字母......
  • 零售EDI:True Value EDI 需求分析
    TrueValue是一家享有盛誉的卖场,经营范围广泛:包括家居用品、工具、园艺用品等。据悉,TrueValue已将EDI纳入其供应商评级中。TrueValue将EDI作为对其供应商的一项要求,这意味着如果你希望与TrueValue建立合作关系,需要尽快具备EDI能力。一旦被告知需要通过EDI向Tr......
  • 正则表达式解析StarRocks雾化视图中的血缘关系
    解析SQL中的底表主要目标是获取出StarRocks雾化中的底表和字段备注,之后给字段赋予备注值,存入库表,可以动态生成数据字典,web可以利用该表实现mybatis的动态sql拼接,动态化的excel导出导入,魔板等功能。尝试使用了Jsqlparser解析sql语句,发现遇到部分复杂的子查询内包含unionall情况......
  • MIT6.s081/6.828 lectrue1:Introduction and examples
    目前课程官网能够查到2020,2021.2022秋季的课程表,但是视频都是2020年录制的那一版简单复习+回顾下自己的OS学习之旅参考资料:官网:https://pdos.csail.mit.edu/6.828/2022/schedule.html视频翻译:https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/教材英文......
  • 正则表达式中?=、?!、?<=、?<!、?:
    一、零宽度断言?=(?=pattern):正向先行断言,表示匹配位置后面必须紧跟着满足pattern的字符串,但不包括这个字符串在匹配结果中。RegExp1(?=RegExp2)匹配后面是RegExp2的RegExp1'我喜欢苹果'.replace(/我喜欢(?=苹果)/,'我讨厌')//匹配我喜欢苹果中的我喜欢并替换为我......
  • 数据类型 —变量—运算符—表达式
    数据类型—变量—运算符—表达式变量命名1.字母,数字,下划线。2.不能以数字开头。3.不能是java关键字。基本数据类型整数命名:inta=1;inta;浮点型命名:floatf=1.234f;字符型命名:charc='何';布尔型命名:booleanb="true";5.引用数据类型类,接口,数组。6.整数......
  • 魔功心法-函数表达式篇(工具类)
    前言:函数表达式篇拖太久了。而且里面的知识点很零散,陆续1-2个月了,也没有找到入手点,体系庞大且复杂,还没有把脉络捋清楚,加上一些个人的事情一直抽不开身。但是抽空写了个工具类,这个工具类主要是包装作用,把要学习的内容大致都过了一遍,先凑合着用吧,已经连注释都懒得写了(~)。工具类......
  • 表达式树的建立和遍历
    启发:2022CSPJT3表达式树是一棵二叉树,二叉树的遍历分为:1.前序遍历(中左右)2.中序遍历(左中右)3.后序遍历(左右中)中序遍历得到的表达式是人看的,前序和后序得到的方便机器运算,其中后序遍历方便在线性时间内求解,并且运算顺序唯一确定。对于一棵表达式树,其叶节点一定是数字,其他节点一......
  • javascript-js正则表达式-常用的正则表达式
    js常用的正则表达式1.匹配Email地址:constemailRegex=/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;2.匹配URL:consturlRegex=/^(https?:\/\/)?([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(:[0-9]+)?(\/[^\s]*)?$/;3.匹配日期(YYYY-MM-DD):constdateRegex=/^\d{4}-(0[1-9]|......
  • java正则表达式过滤工具类
    正则表达式过滤工具类importjava.util.regex.Matcher;importjava.util.regex.Pattern;/***@Description:*@Date:2023/7/7*@Author:*/publicclassCheckUtil{privatestaticfinalStringV_NUMBER="^([1-9]{1}[0-9]{0,})$";privatesta......