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

C++ में दिए गए ऑपरेशन्स के साथ मैक्सिमम स्टैक बनाने का प्रोग्राम


परिचय

मान लीजिए हम एक मैक्सिमम स्टैक (Maximum Stack) बनाना चाहते हैं, जो निम्नलिखित ऑपरेशन्स का समर्थन करता है:

  • MaxStk() - मैक्सिमम स्टैक का नया इंस्टेंस बनाता है
  • push(val) - val को स्टैक में डालता है
  • top() - स्टैक से शीर्ष तत्व प्राप्त करता है
  • max() - स्टैक से अधिकतम तत्व प्राप्त करता है
  • pop() - स्टैक से शीर्ष तत्व हटाता है और वापस करता है
  • popmax() - स्टैक से अधिकतम तत्व हटाता है और वापस करता है

अब मैक्सिमम स्टैक को MasStk() कॉल करके बनाएं, फिर तीन मान जैसे 5, 15, 10 डालें, फिर top(), max(), popmax(), max(), pop(), top() फंक्शन्स को क्रमशः कॉल करें। प्रारंभिक स्टैक स्थिति [5, 15, 10] होगी, और फंक्शन्स के लिए संबंधित आउटपुट: 10, 15, 15, 10, 10, 5

समाधान दृष्टिकोण

हम दो सेट (ऑर्डर्ड कंटेनर्स) का उपयोग करते हैं: एक इंसर्शन ऑर्डर के लिए (stk), एक वैल्यू ऑर्डर के लिए (aux)। प्रत्येक एलिमेंट का एक यूनिक पोजीशन इंडेक्स होता है।

उदाहरण कोड

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

class MaxStk {
    int pos_index = 0;
    set<pair<int, int>, greater<>> stk, aux;  // stk: (pos, val), aux: (val, pos)
    
public:
    MaxStk() {}
    
    void push(int val) {
        stk.emplace(pos_index, val);
        aux.emplace(val, pos_index);
        pos_index++;
    }
    
    int top() {
        if (stk.empty()) return -1;
        return stk.begin()->second;
    }
    
    int max() {
        if (aux.empty()) return -1;
        return aux.begin()->first;
    }
    
    int pop() {
        if (stk.empty()) return -1;
        int id = stk.begin()->first, ret = stk.begin()->second;
        stk.erase(stk.begin());
        aux.erase({ret, id});
        return ret;
    }
    
    int popmax() {
        if (aux.empty()) return -1;
        int ret = aux.begin()->first, id = aux.begin()->second;
        aux.erase(aux.begin());
        stk.erase({id, ret});
        return ret;
    }
};

int main(){
    MaxStk max_stk;
    max_stk.push(5);
    max_stk.push(15);
    max_stk.push(10);
    cout << max_stk.top() << endl;
    cout << max_stk.max() << endl;
    cout << max_stk.popmax() << endl;
    cout << max_stk.max() << endl;
    cout << max_stk.pop() << endl;
    cout << max_stk.top() << endl;
    return 0;
}

इनपुट

max_stk.push(5) max_stk.push(15) max_stk.push(10) max_stk.top() max_stk.max() max_stk.popmax() max_stk.max() max_stk.pop() max_stk.top()

आउटपुट

10 15 15 10 10 5

निष्कर्ष

दो सेट्स का उपयोग करके सभी ऑपरेशन्स O(log n) समय में काम करते हैं। यह डिजाइन पैटर्न तब उपयोगी है जब आपको स्टैक ऑपरेशन्स के साथ-साथ मैक्सिमम क्वेरी की भी आवश्यकता हो। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. - दिए गए ऑपरेशन के साथ प्रत्येक शहर से विज़िट किए जा सकने वाले शहरों की संख्या गिनने के लिए C++ प्रोग्राम

    मान लीजिए हमारे पास N कोऑर्डिनेट पॉइंट्स P की एक लिस्ट है जो (xi, yi) के रूप में है। x और y मान पहले N नेचुरल नंबर्स के क्रमचय हैं। 1 से N की रेंज में प्रत्येक k के लिए। हम शहर k पर हैं। हम ऑपरेशन को मनमाने ढंग से कई बार लागू कर सकते हैं। ऑपरेशन: हम दूसरे शहर में जाते हैं जिसका x-कोऑर्डिनेट छोटा है

  1. कुछ शर्तों के साथ ग्राफ बनाने के लिए C++ प्रोग्राम कुछ शर्तों के साथ ग्राफ बनाने के लिए C++ प्रोग्राम

    मान लीजिए हमारे पास दो संख्याएं N और K हैं। N तत्वों वाला एक निदेशित ग्राफ पर विचार करें। N शीर्ष निम्नलिखित शर्तों को पूरा करते हैं: ग्राफ सरल और जुड़ा हुआ है शीर्ष 1 से N तक गिने जाते हैं मान लें M ग्राफ में किनारों की संख्या है। किनारों को 1 से M तक गिना जाता है। किनारे की लंबाई 1 है। और किनारा

  1. - दिए गए प्रीफिक्स एक्सप्रेशन के लिए C++ में एक्सप्रेशन ट्री का निर्माण

    एक एक्सप्रेशन ट्री मूलतः एक बाइनरी ट्री है जिसका उपयोग एक्सप्रेशन को दर्शाने के लिए किया जाता है। एक एक्सप्रेशन ट्री में, इंटरनल नोड्स ऑपरेटर्स से संबंधित होते हैं और प्रत्येक लीफ नोड ऑपरेंड्स से संबंधित होते हैं। यहां इनऑर्डर, प्रीऑर्डर और पोस्टऑर्डर ट्रैवर्सल में प्रीफिक्स एक्सप्रेशन के लिए एक्सप्