मान लीजिए हमारे पास एक साधारण एक्सप्रेशन स्ट्रिंग है और हमें उस एक्सप्रेशन का मूल्यांकन करने के लिए एक बेसिक कैलकुलेटर लागू करना है। एक्सप्रेशन स्ट्रिंग में ओपनिंग और क्लोजिंग पैरेंथीसिस, प्लस + या माइनस साइन -, नॉन-नेगेटिव इंटीजर्स और खाली स्पेस हो सकते हैं। एक्सप्रेशन स्ट्रिंग में केवल नॉन-नेगेटिव इंटीजर्स, +, -, *, / ऑपरेटर्स, ओपनिंग और क्लोजिंग पैरेंथीसिस और खाली स्पेस होते हैं। इंटीजर डिवीजन को शून्य की ओर ट्रंकेट करना चाहिए।
तो, यदि इनपुट "6-4 / 2" है, तो आउटपुट 4 होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
l1 := 0, l2 := 1
o1 := 1, o2 := 1
एक स्टैक st परिभाषित करें
n := s का आकार
i := 0 से शुरू करें, जब i < n, अपडेट करें (i को 1 से बढ़ाएं), करें:
x := s[i]
यदि x >= '0' और x <= '9', तो:
num := x - '0'
जब (i + 1 < n और s[i + 1] >= '0' और s[i + 1] <= '9'), करें:
(i को 1 से बढ़ाएं)
num := (num * 10) + (s[i] - '0')
l2 := (यदि o2, 1 के समान है, तो l2 * num, अन्यथा l2 / num)
अन्यथा जब x, '(' के समान है, तो:
l1 को st में डालें, o1 को st में डालें
l2 को st में डालें, o2 को st में डालें
l1 := 0, o2 := 1
o1 := 1, l2 := 1
अन्यथा जब x, ')' के समान है, तो:
टेम्प := l1 + o1 * l2
o2 := st का टॉप एलिमेंट
st से एलिमेंट डिलीट करें
l2 := st का टॉप एलिमेंट
st से एलिमेंट डिलीट करें
o1 := st का टॉप एलिमेंट
st से एलिमेंट डिलीट करें
l1 := st का टॉप एलिमेंट
st से एलिमेंट डिलीट करें
l2 := (यदि o2, 1 के समान है, तो l2 * टेम्प, अन्यथा l2 / टेम्प)
अन्यथा जब 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)
l2 := 1, o2 := 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 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;
}
};
int main() {
Solution ob;
cout << (ob.calculate("(5+9*3)/8"));
}
इनपुट
"(5+9*3)/8"
आउटपुट
4