内容简介:根据题意我们可以知道,一个运算符一定会跟随一对括号,比如 !(t)。所以我们可以直接判断expression[0],得到最外层的运算符,根据运算符处理内层的表达式。完整代码见下:
根据题意我们可以知道,一个运算符一定会跟随一对括号,比如 !(t)。
所以我们可以直接判断expression[0],得到最外层的运算符,根据运算符处理内层的表达式。
- 如果不是运算符,肯定就是 't'或者 'f' 直接判断即可
- 如果是't',里面要么就是单一的字符,要么就是一个新的表达式。再调用parseBoolExpr解析并取反即可。
- 如果是 '&' 或者 '|', 需要对里面每个表达式分别求解。通过括号匹配,拿到第一个'('匹配的')'里面的表达式,再通过 parseBoolExpr 计算出值。
- 在计算 '&' 的时候,如果有一个值为false,可以提前结束计算。同理,在计算'|'时, 如果有一个值为true,也可以提前结束计算。
完整代码见下:
func parseBoolExpr(expression string) bool { start, end := 2, len(expression)-1 switch expression[0] { case '!': return Not(expression[start:end]) case '&': return AndOr(expression[start:end], true) case '|': return AndOr(expression[start:end], false) default: return expression == "t" } } // flag &: true |: false func AndOr(exp string, flag bool) bool { pre, idx := 0, 0 for i := 0; i < len(exp); i++ { if exp[i] == '(' { if pre == 0 { idx = i } pre++ } else if exp[i] == ')' { pre-- if pre == 0 { t := parseBoolExpr(exp[idx-1 : i+1]) if !t && flag { return false } if t && !flag { return true } } } else { if pre <= 0 { if exp[i] == 'f' && flag { return false } if exp[i] == 't' && !flag { return true } } } } return flag } func Not(exp string) bool { if len(exp) == 1 { return !(exp == "t") } return !parseBoolExpr(exp) }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Go 语言的布尔值
- Haskell:非严格的布尔运算
- 6. Go 语言数据类型:字典与布尔类型
- 6. Go语言中的字典与布尔类型
- final修饰的Boolean(布尔值)可以被修改值?
- Android RxJava 操作符详解系列:条件 / 布尔操作符
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Realm of Racket
Matthias Felleisen、Conrad Barski M.D.、David Van Horn、Eight Students Northeastern University of / No Starch Press / 2013-6-25 / USD 39.95
Racket is the noble descendant of Lisp, a programming language renowned for its elegance and power. But while Racket retains the functional goodness of Lisp that makes programming purists drool, it wa......一起来看看 《Realm of Racket》 这本书的介绍吧!