मान लीजिए हम एक बेसिक कैलकुलेटर बनाना चाहते हैं जो बेसिक अभिव्यक्ति परिणाम ढूंढेगा। अभिव्यक्ति में खुले और बंद कोष्ठक, प्लस या माइनस प्रतीक और खाली स्थान हो सकते हैं।
तो यदि स्ट्रिंग "5 + 2 - 3" जैसी है, तो परिणाम 4 होगा।
इसे हल करने के लिए, हम निम्नलिखित चरणों का पालन करेंगे -
ret := 0, sign := 1, num := 0, n := s का आकार
एक स्टैक st परिभाषित करें
i := 0 से आरंभ करें, जब i < n, i को 1 से बढ़ाएं करें -
आकार i की एक सरणी x = s परिभाषित करें
यदि x >= '0' और x <= '9', तो,
num = num * 10
num = num + (x - '0')
अन्यथा जब x '(' के समान है, तो -
ret = ret + (sign * num)
ret को st में डालें
sign को st में डालें
ret := 0, sign := 1, num := 0
अन्यथा जब x ')' के समान है, तो -
ret = ret + (sign * num), sign := 1, num := 0
ret = ret * st का शीर्ष तत्व
st से आइटम हटाएं
ret = ret + st का शीर्ष तत्व
st से आइटम हटाएं
अन्यथा जब x '+' के समान है, तो -
ret = ret + (sign * num), sign := 1, num := 0
अन्यथा जब x '-' के समान है, तो -
ret = ret + (sign * num), sign := - 1, num := 0
यदि num शून्येतर है, तो,
ret = ret + sign * num
ret लौटाएं
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें -
#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