1106. 解析布尔表达式

1106. 解析布尔表达式1106.解析布尔表达式_假设在布尔表达式中,操作数只有t和f,并且t表示真、f表示假,运算符&、|、!

题目:

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

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

“t”,运算结果为 True
“f”,运算结果为 False
“!(expr)”,运算过程为对内部表达式 expr 进行逻辑 非的运算(NOT)
“&(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 与的运算(AND)
“|(expr1,expr2,…)”,运算过程为对 2 个或以上内部表达式 expr1, expr2, … 进行逻辑 或的运算(OR)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/parsing-a-boolean-expression
 

解题思路:

对于这种表达式解析问题,我们可以使用栈来辅助解决。

从左到右遍历表达式 expression,对于遍历到的每个字符 cc:

如果 cc 是 “tf!&|” 中的一个,我们直接将其入栈;
如果 cc 是右括号 ‘)’,我们将栈中元素依次出栈,直到遇到操作符 ‘!’ 或 ‘&’ 或 ‘|’。过程中我们用变量 tt 和 ff 记录出栈字符中 ‘t’ 和 ‘f’ 的个数。最后根据出栈字符的个数和操作符计算得到新的字符 ‘t’ 或 ‘f’,并将其入栈。
遍历完表达式 expression 后,栈中只剩下一个字符,如果是 ‘t’,返回 true,否则返回 false。

代码:

(Java)

class Solution {
	    public boolean parseBoolExpr(String expression) {
         var stack = new ArrayDeque<Character>();
        
         for(char c:expression.toCharArray()) {
        	 if(c!='('&&c!=')'&& c!=',') {  //将操作数与操作符放入栈
        		 stack.push(c);
        	 }
        	 if(c == ')') {
        		 int tnum =0 ,fnum = 0;  //统计't'与'f'的个数,方便后面的计算
        		 while(stack.peek()=='f' || stack.peek() == 't') {
        			 if(stack.peek() == 'f') {
        				 fnum++;
        				 stack.pop();
        			 }else {
						tnum++;
						stack.pop();
					}
        		 }
        		 char opt = stack.pop();
            	 char res = 'f';  //计算
            	 if((opt =='!'&& fnum>0) || (opt == '&')&& fnum==0 || (opt == '|')&&tnum>0) {
            		 res = 't';
            	 }
            	 stack.push(res);  //计算结果放入栈中
        	 }
        	 
         }
         return stack.peek() =='t';//最后栈中只会剩下一个,即结果
	    }
	}

C++:

class Solution {
public:
	bool parseBoolExpr(string expression) {
		deque<char> stack;
		for (char c : expression) {
			if (c != '(' && c != ')' && c != ',') {
				stack.push_back(c);
			}
			else if (c == ')') {
				int tnum = 0, fnum = 0;
				while (stack.back() == 'f' || stack.back() == 't') {
					if (stack.back() == 'f') {
						fnum++;
						stack.pop_back();
					}
					else {
						tnum++;
						stack.pop_back();
					}
				}
				char opt = stack.back();
				stack.pop_back();
				char res = 'f';
				if ((opt == '!' && fnum > 0) || (opt == '&' && fnum == 0) || (opt == '|' && tnum > 0)) {
					res = 't';
				}
				stack.push_back(res);
			}
		}

		return stack.back() == 't';
	}
};

今天的文章1106. 解析布尔表达式分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63708.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注