สมมติว่าเรามีสตริง s เป็น S-expression เราต้องประเมินว่านิพจน์ S และส่งคืนผลลัพธ์เป็นจำนวนเต็ม ดังที่เราทราบแล้วว่า s-expression เป็นนิพจน์ที่เป็นหนึ่งตัวเลข หรือนิพจน์แบบเรียกซ้ำที่อยู่ในวงเล็บ เช่น (+ (- 3 2) (* 3 3)) ซึ่งระบุ (3 - 2) + (3 * 3) =10. ตัวดำเนินการที่ถูกต้องคือ +, -, * และ /.
ดังนั้น หากอินพุตเป็น s ="(- (+ 3 2) 2)" ผลลัพธ์จะเป็น 3 เนื่องจาก ((3 + 2) - 2) =3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
stack :=สแต็คใหม่
-
ลบวงเล็บเปิดและปิดของ s
-
a :=แบ่ง s โดยใช้ช่องว่างและสร้างรายการพาร์ติชั่น
-
สำหรับแต่ละ i ในลำดับที่กลับกัน ทำ
-
ถ้าขนาด i> 1 แล้ว
-
ถ้า i[0] เหมือนกับ "-" แล้ว
-
ดัน i เป็นจำนวนเต็มลงใน stack
-
ไปทำซ้ำต่อไป
-
-
มิฉะนั้น
-
ดัน i เป็นจำนวนเต็มลงใน stack
-
-
-
มิฉะนั้นเมื่อฉันเป็นตัวเลขแล้ว
-
ดัน i เป็นจำนวนเต็มลงใน stack
-
-
มิฉะนั้น
-
ถ้าขนาดของ stack>=2 แล้ว
-
num1 :=ป๊อปจากสแต็ก
-
num2 :=ป๊อปจากสแต็ก
-
ถ้าฉันเหมือนกับ "+" แล้ว
-
ดำเนินการ num1 + num2 แล้วดันเข้าไปในสแต็ก
-
-
มิฉะนั้นเมื่อฉันเหมือนกับ "-" แล้ว
-
ดำเนินการ num1 - num2 และผลักเข้าสู่สแต็ก
-
-
มิฉะนั้นเมื่อฉันเหมือนกับ "*" แล้ว
-
ดำเนินการ num1 * num2 และกดลงในสแต็ก
-
-
มิฉะนั้น
-
ดำเนินการ num1 / num2 และผลักเข้าสู่สแต็ก
-
-
-
-
-
ส่งคืนองค์ประกอบบนสุดจากสแต็ก และลบองค์ประกอบบนสุด
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution: def solve(self, s): stack = list() s = s.replace("(", "") s = s.replace(")", "") a = s.split() for i in a[::-1]: if len(i) > 1: if i[0] == "-": stack.append(int(i)) continue else: stack.append(int(i)) elif i.isdigit(): stack.append(int(i)) else: if len(stack) >= 2: num1 = stack.pop() num2 = stack.pop() if i == "+": stack.append(int(num1 + num2)) elif i == "-": stack.append(int(num1 - num2)) elif i == "*": stack.append(int(num1 * num2)) else: stack.append(int(num1 / num2)) return stack.pop() ob = Solution() s = "(- (+ 3 2) 2)" print(ob.solve(s))
อินพุต
s = "(- (+ 3 2) 2)"
ผลลัพธ์
3