四、解析布尔表达式(Weekly Contest 143)

题目描述:

给你一个以字符串形式表述的 布尔表达式(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 是以上述形式给出的有效表达式,表示一个布尔值。

代码:比较简单的一道题目,使用一个栈即可。
虽然做出来了但是已经过了时间,十二点十三分做出来的…

class Solution {
      public static boolean parseBoolExpr(String expression) {
	   Stack<String> stack2 = new Stack<>();
	   for (int i = 0; i < expression.length(); i++) {
		   String tems = String.valueOf(expression.charAt(i));
		   if(isfuhao(tems)){
			   stack2.push(tems);
		   }else if (tems.equals("(")) {
			   stack2.push(tems);
		   }else if (tems.equals(",")) {
			   continue;
		   }else if (tems.equals(")")) {
			   boolean tem = get(stack2);
			   stack2.push(String.valueOf(tem));
		   }else if (tems.equals("t")) {
			stack2.push("true");
		   }else if (tems.equals("f")) {
			   stack2.push("false");
		   }
	   	}
	   return Boolean.parseBoolean(stack2.pop());
       
   }

   public static boolean get(Stack<String> stack){
	   List<Boolean> list = new ArrayList<>();
	   while (!stack.peek().equals("(")) {
		   list.add(Boolean.valueOf(stack.pop()));
	   }
	   System.out.println(list);
//	   弹出左括号
	   stack.pop();
//	   弹出符号 ! || &&
	   String getString = stack.pop();
	   if(getString.equals("!")){
		   return !list.get(0);
	   }else if (getString.equals("&")) {
		   if(list.contains(false)){
			   return false;
		   }else {
			return true;
		   }
   		}else{
	   		 if(list.contains(true)){
				   return true;
			   }else {
				return false;
			   }
   		}
   }
   			
   public static boolean isfuhao(String tem){
	   if(tem.equals("!") || tem.equals("&") || tem.equals("|")){
		   return true;
	   }else {
		return false;
	}
   }
}

猜你喜欢

转载自blog.csdn.net/qq_34446716/article/details/94304401