สมมติว่าเราต้องการสร้างเครื่องคิดเลขพื้นฐานหนึ่งเครื่องที่จะหาผลลัพธ์ของนิพจน์พื้นฐาน นิพจน์สามารถใส่วงเล็บเปิดและปิด บวกหรือลบสัญลักษณ์และช่องว่าง
ดังนั้นหากสตริงเป็นแบบ “5 + 2 - 3” ผลลัพธ์จะเป็น 7
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ret :=0, sign :=1, num :=0, n :=size of s
-
กำหนดหนึ่งสแต็ก st
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน
-
กำหนดอาร์เรย์ x =s ขนาด i
-
ถ้า x>='0' และ x <='9' แล้ว
-
นัม =นัม * 10
-
num =num + (x - '0')
-
-
มิฉะนั้นเมื่อ x เหมือนกับ '(' แล้ว −
-
ret =ret + (เครื่องหมาย * num)
-
ใส่ ret ลงใน st
-
ใส่เครื่องหมายลงใน st
-
ret :=0, sign :=1, num :=0
-
-
มิฉะนั้นเมื่อ x เหมือนกับ ')' ดังนั้น −
-
ret =ret + (เครื่องหมาย * num), เครื่องหมาย :=1, num :=0
-
ret =ret * องค์ประกอบด้านบนของ st
-
ลบรายการออกจาก st
-
ret =ret + องค์ประกอบด้านบนของ st
-
ลบรายการออกจาก st
-
-
มิฉะนั้นเมื่อ x เหมือนกับ '+' แล้ว −
-
ret =ret + (เครื่องหมาย * num), เครื่องหมาย :=1, num :=0
-
-
มิฉะนั้นเมื่อ x เหมือนกับ '-' แล้ว −
-
ret =ret + (เครื่องหมาย * num), เครื่องหมาย :=- 1, num :=0
-
-
-
ถ้า num ไม่ใช่ศูนย์ ดังนั้น
-
ret =ret + เครื่องหมาย * num
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int calculate(string s) { int ret = 0; int sign = 1; int num = 0; int n = s.size(); stack <int> st; for(int i = 0; i < n; ++i){ char x = s[i]; if(x >= '0' && x <= '9'){ num *= 10; num += (x - '0'); } else if(x == '('){ ret += (sign * num); st.push(ret); st.push(sign); ret = 0; sign = 1; num = 0; } else if(x == ')'){ ret += (sign * num); sign = 1; num = 0; ret *= st.top(); st.pop(); ret += st.top(); st.pop(); } else if(x == '+'){ ret += (sign * num); sign = 1; num = 0; } else if(x == '-'){ ret += (sign * num); sign = -1; num = 0; } } if(num){ ret += sign * num; } return ret; } }; main(){ Solution ob; cout << (ob.calculate("5 + 2 - 3")); }
อินพุต
"5 + 2 - 3"
ผลลัพธ์
4