สมมติว่าเรามีสตริงที่แสดงนิพจน์ทางคณิตศาสตร์ด้วย (+, -, *, /) ที่นี่ / แทนการหารจำนวนเต็ม เราต้องประเมินและส่งคืนผลลัพธ์โดยไม่ต้องใช้ฟังก์ชันในตัว
ดังนั้น หากอินพุตเป็น s ="2+3*5/7" ผลลัพธ์จะเป็น 4 เช่น 2 + ((3 * 5) / 7) =4
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- s :=ย้อนกลับสตริงที่กำหนด
- กำหนดฟังก์ชัน get_value()
- ลงชื่อ :=1
- ถ้า s ไม่ว่างและองค์ประกอบสุดท้ายของ s เหมือนกับ "-" แล้ว
- ลบองค์ประกอบสุดท้ายออกจาก s
- ลงชื่อ :=-1
- ค่า :=0
- ในขณะที่ s ไม่ว่างเปล่าและองค์ประกอบสุดท้ายของ s เป็นตัวเลข ให้ทำ
- ค่า :=ค่า * 10
- ค่า :=ค่า + ค่าตัวเลขขององค์ประกอบสุดท้ายจาก s และลบองค์ประกอบสุดท้ายของ s
- ค่าเครื่องหมายส่งคืน *
- กำหนดฟังก์ชัน get_term()
- term :=get_value()
- ในขณะที่ s ไม่ว่างเปล่า และองค์ประกอบสุดท้ายของ s คือ * หรือ /, do
- op :=องค์ประกอบสุดท้ายของ s และลบองค์ประกอบสุดท้ายออกจาก s
- value :=get_value()
- ถ้า op เหมือนกับ "*" แล้ว
- ระยะ :=ระยะ * ค่า
- มิฉะนั้น
- term :=พื้นของ (1.0 * เทอม / ค่า)
- ระยะเวลาคืนสินค้า
- จากวิธีหลัก ให้ทำดังนี้:
- ตอบ :=get_term()
- ในขณะที่ยังไม่ว่างให้ทำ
- op :=องค์ประกอบสุดท้ายของ s และลบออกจาก s
- term :=get_term()
- ถ้า op เหมือนกับ "+" แล้ว
- ans :=ans + เทอม
- มิฉะนั้น
- ans :=ans - เทอม
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
from math import floor, trunc class Solution: def solve(self, s): s = list(s[::-1]) def get_value(): sign = 1 if s and s[-1] == "-": s.pop() sign = -1 value = 0 while s and s[-1].isdigit(): value *= 10 value += int(s.pop()) return sign * value def get_term(): term = get_value() while s and s[-1] in "*/": op = s.pop() value = get_value() if op == "*": term *= value else: term = floor(1.0 * term / value) return term ans = get_term() while s: op, term = s.pop(), get_term() if op == "+": ans += term else: ans -= term return ans ob = Solution() s = "2+3*5/7" print(ob.solve(s))
อินพุต
"2+3*5/7"
ผลลัพธ์
4