Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python에서 부울 표현식 구문 분석

<시간/>

부울 표현식이 있다고 가정하고 해당 표현식을 평가한 후 결과를 찾아야 합니다.

표현식은 다음 중 하나일 수 있습니다. -

  • "t", True로 평가됨;

  • "f", False로 평가됨,

  • "!(expression)", 내부 표현식의 논리적 NOT으로 평가,

  • "&(expr1,expr2,...)", 2개 이상의 내부 표현식의 논리적 AND로 평가,

  • "|(expr1,expr2,...)", 2개 이상의 내부 표현식의 논리적 OR로 평가,

따라서 입력이 "|(!(t),&(t,f,t))"와 같으면 출력이 fasle입니다. 이는 !(t)가 거짓이고 &(t,f, t)도 거짓이므로 모든 거짓 값의 OR은 거짓이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • solve()를 정의하면 e, i

    가 필요합니다.
  • e[i]가 "f"와 같으면 -

    • 반환(거짓, i + 1)

  • 그렇지 않으면 e[i]가 "t"와 같을 때 -

  • 반환(True,i + 1)

  • 연산 :=e[i], i :=i + 2

  • 하나의 스택 정의

  • e[i]가 닫는 괄호가 아닌 동안 −

    • e[i]가 ","와 같으면 -

      • 나는 :=나는 + 1

      • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

    • res,i :=해결(e,i)

    • res를 스택에 푸시

  • op가 "&"와 같으면 -

    • 스택의 모든 요소가 true이면 true를 반환하고 그렇지 않으면 false를 반환합니다. i + 1

  • 그렇지 않으면 op가 " OR "과 같을 때 -

    • 스택에서 적어도 하나의 요소가 true이면 true를 반환하고 그렇지 않으면 false를 반환합니다. i + 1

  • 반환(스택[0]의 역수, i + 1)

  • 기본 방법에서 다음을 수행하십시오 -

  • s,y :=해결(표현식, 0)

  • 반환 s

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

class Solution(object):
   def parseBoolExpr(self, expression):
      s,y = self.solve(expression,0)
      return s
   def solve(self,e,i):
      if e[i] =="f":
         return False,i+1
      elif e[i] == "t":
         return True,i+1
      op = e[i]
      i = i+2
      stack = []
      while e[i]!=")":
         if e[i] == ",":
            i+=1
            continue
         res,i = self.solve(e,i)
         stack.append(res)
      if op == "&":
         return all(stack),i+1
      elif op == "|":
         return any(stack),i+1
      return not stack[0],i+1
ob = Solution()
print(ob.parseBoolExpr("|(!(t),&(t,f,t))"))

입력

"|(!(t),&(t,f,t))"

출력

False