สมมติว่าเรามีสตริงที่มีนิพจน์บูลีนที่มีตัวดำเนินการ "และ" และ "หรือ" ประเมินและส่งคืนผลลัพธ์ ในที่นี้ นิพจน์อาจมีวงเล็บ ซึ่งควรประเมินก่อน
ดังนั้น หากอินพุตเป็น s ="T และ (F หรือ T)" ผลลัพธ์จะเป็น True
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
-
stack :=รายการใหม่
-
t =รายการองค์ประกอบของ s แบ่งตามช่องว่าง
-
สำหรับแต่ละ v ใน t ทำ
-
ถ้า v[0] เหมือนกับ "(" แล้ว
-
ดันจริงเมื่อ v[จากดัชนีของ "(" ถึง end] เหมือนกับ "T" ลงในสแต็ก
-
-
มิฉะนั้นเมื่อพบ ")" แล้ว
-
ct :=จำนวนวงเล็บปิด ")" ใน v
-
ดันจริงเมื่อ v[จากดัชนี 0 ถึงขนาดของ v - ct] เท่ากับ "T" ลงในสแต็ก
-
สำหรับแต่ละค่าในช่วง 0 ถึง ct-1 ทำ
-
ขวา :=ป๊อปจากสแต็ก
-
-
-
-
:=ป๊อปจากสแต็ก
-
ซ้าย :=ป๊อปจากสแต็ก
-
ดำเนินการ (ซ้าย o ขวา) และดันเข้าไปในกอง
-
มิฉะนั้นเมื่อ v เป็น "T" หรือ "F" ดังนั้น
-
กดจริงเมื่อ v เหมือนกับ "T" ลงในสแต็ก
-
-
มิฉะนั้น
-
ดัน op[v] ลงใน stack
-
-
-
หากองค์ประกอบนับใน stack> 1 แล้ว
-
สำหรับฉันในช่วง 0 ถึงขนาดของสแต็ก - 1 เพิ่มขึ้น 2 ทำ
-
stack[i + 2] :=stack[i + 1](stack[i], stack[i + 2])
-
-
ส่งคืนองค์ประกอบด้านบนของ stack
-
-
ส่งคืนองค์ประกอบด้านล่างของ stack
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
class Solution:
def solve(self, s):
stack = []
op = {
"or": lambda x, y: x or y,
"and": lambda x, y: x and y,
}
for v in s.split():
if v[0] == "(":
stack.append(v[v.count("(") :] == "T")
elif v.count(")") > 0:
ct = v.count(")")
stack.append(v[:-ct] == "T")
for _ in range(ct):
right = stack.pop()
o = stack.pop()
left = stack.pop()
stack.append(o(left, right))
elif v in ["T", "F"]:
stack.append(v == "T")
else:
stack.append(op[v])
if len(stack) > 1:
for i in range(0, len(stack) - 1, 2):
stack[i + 2] = stack[i + 1](stack[i], stack[i + 2])
return stack[-1]
return stack[0]
ob = Solution()
s = "T and (F or T)"
print(ob.solve(s)) อินพุต
"T and (F or T)"
ผลลัพธ์
True