मान लीजिए कि हमारे पास एक साधारण अभिव्यक्ति स्ट्रिंग है और हमें उस अभिव्यक्ति का मूल्यांकन करने के लिए एक बुनियादी कैलकुलेटर लागू करना होगा। एक्सप्रेशन स्ट्रिंग में ओपनिंग और क्लोजिंग कोष्ठक, प्लस + या माइनस साइन -, गैर-ऋणात्मक पूर्णांक और रिक्त स्थान हो सकते हैं। व्यंजक स्ट्रिंग में केवल गैर-ऋणात्मक पूर्णांक, +, -, *, / ऑपरेटर, कोष्ठकों को खोलना और बंद करना और रिक्त स्थान शामिल हैं। पूर्णांक विभाजन शून्य की ओर छोटा होना चाहिए।
इसलिए, यदि इनपुट "6-4/2" जैसा है, तो आउटपुट 4
. होगाइसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एल1:=0, एल2:=1
-
o1 :=1, o2 :=1
-
एक स्टैक सेंट परिभाषित करें
-
n :=s का आकार
-
इनिशियलाइज़ i:=0 के लिए, जब i
-
एक्स:=एस [i]
-
अगर x>='0' और x <='9', तो -
-
संख्या :=x - '0'
-
जबकि (i + 1
='0' और s[i + 1] <='9'), करते हैं - -
(i 1 से बढ़ाएँ)
-
संख्या:=(संख्या * 10) + (एस [i] - '0')
-
-
l2 :=(यदि o2 1 के समान है, तो l2 * num, अन्यथा l2 / num)
-
-
अन्यथा जब x '(' के समान हो, तब -
-
सेंट में l1 डालें, o1 को सेंट में डालें
-
सेंट में l2 डालें, o2 को सेंट में डालें
-
एल1:=0, ओ2:=1
-
ओ1:=1, एल2:=1
-
-
अन्यथा जब x ')' के समान हो, तब -
-
अस्थायी:=l1 + o1 * l2
-
o2:=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
l2:=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
o1 :=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
l1:=सेंट का शीर्ष तत्व
-
सेंट से तत्व हटाएं
-
l2 :=(यदि o2 1 के समान है, तो l2 * temp, अन्यथा l2 / temp)
-
-
अन्यथा जब x '*' के समान हो या x, '/' के समान हो, तब -
-
o2 :=(यदि x '*' के समान है, तो 1, अन्यथा -1)
-
-
अन्यथा जब x '+' के समान हो या x, '-' के समान हो, तो -
-
यदि x '-' के समान है और (i 0 के समान है या (i - 1>=0 और s[i - 1] '(') के समान है), तो -
-
o1 :=-1
-
निम्नलिखित भाग पर ध्यान न दें, अगले पुनरावृत्ति पर जाएं
-
-
l1 :=l1 + o1 * l2
-
o1 :=(यदि x '+' के समान है, तो 1, अन्यथा -1)
-
एल2:=1, ओ2:=1
-
-
-
वापसी l1 + o1 * l2
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int calculate(string s) { lli l1 = 0; lli l2 = 1; lli o1 = 1; lli o2 = 1; stack<lli> st; lli n = s.size(); for (lli i = 0; i < n; i++) { char x = s[i]; if (x >= '0' && x <= '9') { lli num = x - '0'; while (i + 1 < n && s[i + 1] >= '0' && s[i + 1] <= '9') { i++; num = (num * 10) + (s[i] - '0'); } l2 = (o2 == 1) ? l2 * num : l2 / num; } else if (x == '(') { st.push(l1); st.push(o1); st.push(l2); st.push(o2); l1 = 0; o2 = 1; o1 = 1; l2 = 1; } else if (x == ')') { lli temp = l1 + o1 * l2; o2 = st.top(); st.pop(); l2 = st.top(); st.pop(); o1 = st.top(); st.pop(); l1 = st.top(); st.pop(); l2 = (o2 == 1) ? l2 * temp : l2 / temp; } else if (x == '*' || x == '/') { o2 = (x == '*') ? 1 : -1; } else if (x == '+' || x == '-') { if (x == '-' && (i == 0 || (i - 1 >= 0 && s[i - 1] == '('))) { o1 = -1; continue; } l1 += o1 * l2; o1 = (x == '+') ? 1 : -1; l2 = 1; o2 = 1; } } return l1 + o1 * l2; } }; main(){ Solution ob; cout << (ob.calculate("(5+9*3)/8")); }
इनपुट
"(5+9*3)/8"
आउटपुट
4