Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में बेसिक कैलकुलेटर III

मान लीजिए हमारे पास एक साधारण एक्सप्रेशन स्ट्रिंग है और हमें उस एक्सप्रेशन का मूल्यांकन करने के लिए एक बेसिक कैलकुलेटर लागू करना है। एक्सप्रेशन स्ट्रिंग में ओपनिंग और क्लोजिंग पैरेंथीसिस, प्लस + या माइनस साइन -, नॉन-नेगेटिव इंटीजर्स और खाली स्पेस हो सकते हैं। एक्सप्रेशन स्ट्रिंग में केवल नॉन-नेगेटिव इंटीजर्स, +, -, *, / ऑपरेटर्स, ओपनिंग और क्लोजिंग पैरेंथीसिस और खाली स्पेस होते हैं। इंटीजर डिवीजन को शून्य की ओर ट्रंकेट करना चाहिए।

तो, यदि इनपुट "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
  1. C++ में हाउस रॉबर III C++ में हाउस रॉबर III

    मान लीजिए एक चोर ने अपनी चोरी के लिए एक नई जगह ढूंढ ली है। इस क्षेत्र में केवल एक प्रवेश द्वार है, प्रवेश द्वार को रूट कहा जाता है। रूट के अलावा, प्रत्येक घर का एक और केवल एक पैरेंट घर होता है। एक दौरे के बाद, स्मार्ट चोर को लगा कि इस जगह के सभी घर एक बाइनरी ट्री बनाते हैं। और यदि दो सीधे-लिंक्ड घरो

  1. C++ में पाथ सम III - रूट से लीफ तक दिए गए योग वाले पाथ ढूंढना C++ में पाथ सम III - रूट से लीफ तक दिए गए योग वाले पाथ ढूंढना

    मान लीजिए हमारे पास एक बाइनरी ट्री है जिसमें प्रत्येक नोड एक पूर्णांक मान रखता है। हमें उन पाथ को ढूंढना है जिनका योग दिए गए मान के बराबर हो। पाथ रूट से लीफ तक होना चाहिए। समस्या विवरण यदि ट्री है [5,4,8,11,null,13,4,7,2,null,null,5,1] और योग 22 है, तो परिणाम होगा - पाथ हैं: [[5,4,11,2],[5,8,4,5]

  1. C++ में बेसिक ग्राफिक्स प्रोग्रामिंग C++ में बेसिक ग्राफिक्स प्रोग्रामिंग

    C++ प्रोग्रामिंग लैंग्वेज एक बहुमुखी प्रोग्रामिंग लैंग्वेज है। C++ का उपयोग करके आप लो-एंड ग्राफिक्स भी बना सकते हैं यानी बेसिक शेप्स और स्टाइलिश फॉन्ट्स के साथ शब्द बनाना और उनमें रंग जोड़ना C++ का उपयोग करके किया जा सकता है। ग्राफिक्स प्रोग्रामिंग C++ में आपके टर्मिनल या कमांड प्रॉम्प्ट का उपयोग क