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

C++ में इंक्रीमेंट ऑपरेशन के साथ स्टैक डिजाइन करना


मान लीजिए हम एक ऐसा स्टैक डिजाइन करना चाहते हैं जो निम्न ऑपरेशन्स को सपोर्ट करता है:

  • CustomStack(int maxSize) यह ऑब्जेक्ट को maxSize से इनिशियलाइज़ करता है जो स्टैक में एलिमेंट्स की अधिकतम संख्या है या कुछ नहीं करता अगर स्टैक maxSize तक पहुंच गया है।

  • void push(int x) यह x को स्टैक के टॉप पर इंसर्ट करता है अगर स्टैक maxSize तक नहीं पहुंचा है।

  • int pop() यह स्टैक के टॉप को डिलीट और लौटाता है या -1 अगर स्टैक खाली है।

  • void inc(int k, int val) यह स्टैक के बॉटम k एलिमेंट्स को val से बढ़ाता है। अगर स्टैक में k से कम एलिमेंट्स हैं, तो स्टैक के सभी एलिमेंट्स को बढ़ाएं।

इसे हल करने के लिए, हम इन स्टेप्स को फॉलो करेंगे:

  • दो ऐरे st और inc डिफाइन करें, और एक इंटीजर टाइप डेटा cap बनाएं

  • इनिशियलाइज़र में, cap := N सेट करें और inc := साइज N + 10 का नया ऐरे सेट करें

  • push(x) मेथड के लिए, अगर स्टैक का साइज cap नहीं है, तो x को st में इंसर्ट करें।

  • pop() ऑपरेशन इस तरह काम करेगा:

    • अगर st खाली है, तो -1 लौटाएं

    • अन्यथा:

      • स्टैक का टॉप := स्टैक का टॉप + inc[स्टैक का टॉप इंडेक्स]

      • अगर स्टैक में कुछ एलिमेंट है, तो inc[st का साइज - 2] को inc[st का साइज - 1] से बढ़ाएं

      • inc[st का साइज - 1] := 0

      • x := st का लास्ट एलिमेंट

      • x लौटाएं

  • inc() मेथड इस तरह काम करेगा:

    • k को 1 से घटाएं

    • k := k और st का साइज - 1 का मिनिमम

    • अगर k < 0, तो लौट जाएं

    • inc[k] को val से बढ़ाएं।

उदाहरण (C++)

बेहतर समझ के लिए निम्न इम्प्लीमेंटेशन देखें:

#include <bits/stdc++.h>
using namespace std;

class CustomStack {
public:
    vector <int> st;
    vector <int> inc;
    int cap;
    CustomStack(int N) {
        cap = N;
        inc = vector <int>(N + 10);
    }
    void push(int x) {
        if(st.size() == cap) return;
        st.push_back(x);
    }
    int pop() {
        if(st.empty()) return -1;
        else{
            st.back() += inc[st.size() - 1];
            if(st.size() - 1 > 0 ){
                inc[st.size() - 2] += inc[st.size() - 1];
            }
            inc[st.size() - 1] = 0;
            int x = st.back();
            st.pop_back();
            return x;
        }
    }
    void increment(int k, int val) {
        k--;
        k = min(k, (int)st.size() - 1);
        if(k < 0) return;
        inc[k] += val;
    }
};

int main(){
    CustomStack ob(3);
    ob.push(1);
    ob.push(2);
    cout << ob.pop() << endl;
    ob.push(2);
    ob.push(3);
    ob.push(4);
    ob.increment(5, 100);
    ob.increment(2, 100);
    cout << ob.pop() << endl;
    cout << ob.pop() << endl;
    cout << ob.pop() << endl;
    cout << ob.pop() << endl;
}

इनपुट

मुख्य() फंक्शन देखें

आउटपुट

2 103 202 201 -1

  1. - C++ में 0 अंक वाली 'd' अंकों की धनात्मक पूर्णांक गिनें

    इस ट्यूटोरियल में, हम d अंकों वाली संख्याएं जिनमें 0 एक अंक के रूप में है, खोजने के लिए एक प्रोग्राम पर चर्चा करेंगे।इसके लिए हमें एक संख्या d प्रदान की जाएगी। हमारा कार्य d अंकों वाली और उनके अंकों में से एक के रूप में 0 वाली धनात्मक पूर्णांकों की संख्या को गिनना और प्रिंट करना है।उदाहरण#include<

  1. - C++ में अभाज्य संख्या P के बाद N अभाज्य संख्याएं जिनका योग S हो

    इस समस्या में, हमें तीन संख्याएं दी गई हैं: योग S, अभाज्य P, और N। हमारा कार्य P से बड़ी उन N अभाज्य संख्याओं को ढूंढना है जिनका योग S के बराबर हो। आइए एक उदाहरण से समझते हैं: इनपुट: N = 2, P = 5, S = 18 आउटपुट: 7 11 व्याख्या: 5 से बड़ी अभाज्य संख्याएं: 7, 11, 13। योग = 7 + 11 = 18 इस समस्या को हल

  1. - C++ में मैट्रिक्स में विषम मान वाले सेल्स

    मान लें n और m हैं जो एक मैट्रिक्स के आयाम हैं। ये शून्य से इनिशियलाइज़्ड हैं। और इंडेक्स दिए गए हैं जहां indices[i] = [ri, ci]। [ri, ci] के प्रत्येक जोड़े के लिए हमें पंक्ति ri और स्तंभ ci में सभी सेल्स को 1 से बढ़ाना है। आउटपुट सभी इंडेक्स पर वृद्धि लागू करने के बाद मैट्रिक्स में विषम मान वाले सेल