কম্পিউটার টিউটোরিয়াল

C++-এ ফ্রিকোয়েন্সি স্ট্যাক (Frequency Stack) কনস্ট্রাক্ট করা

মান লইয়া আমরা একটি স্ট্যাক কনস্ট্রাক্ট করতে চাই নামক FrequencyStack, যাতে দুটি ফাংশন থাকে:

  • append(x), এটি ভ্যালু x স্টাকে অ্যাপেন্ড বা পুশ করবে।
  • pop(), এটি স্ট্যাক থেকে সবচেয়ে বেশি ফ্রিকোয়েন্সি বিশিষ্ট এলিমেন্ট রিমুভ করবে এবং রিটার্ন করবে। যদি একাধিক এলিমেন্ট একই ফ্রিকোয়েন্সি থাকে, তবে স্ট্যাকের টপের কাছাকাছি এলিমেন্টটি রিমুভ ও রিটার্ন করা হবে।

তবে, যদি ইনপুট হয় 7, 9, 7, 9, 6, 7 অ্যাপেন্ড করুন, তারপর চারবার pop অপারেশন করুন, তবে আউটপুট হবে 7, 9, 7, 6 যথাক্রমে।

এটি সমাধান করতে, আমরা এই ধাপগুলো ফলো করব:

  • একটি map cnt ডিফাইন করুন
  • একটি map sts ডিফাইন করুন
  • maxFreq := 0
  • append() ফাংশন ডিফাইন করুন, এটি x নেবে:
    • cnt[x]++
    • maxFreq := max(maxFreq, cnt[x])
    • x কে sts[cnt[x]]-এ পুশ করুন
  • pop() ফাংশন ডিফাইন করুন:
    • maxKey := maxFreq
    • x := sts[maxKey]-এর টপ এলিমেন্ট
    • sts[maxKey]-এর টপ ডিলিট করুন
    • যদি sts[maxKey]-এর সাইজ ০ হয়, তবে maxKey sts থেকে ডিলিট করুন এবং maxFreq--
    • cnt[x]--
    • x রিটার্ন করুন

বेहतर বোঝার জন্য ইমপ্লিমেন্টেশন দেখুন:

উদাহরণ

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

class FreqStack {
public:
    unordered_map <int ,int > cnt;
    unordered_map <int, stack <int> > sts;
    int maxFreq = 0;
    FreqStack() {
        maxFreq = 0;
        cnt.clear();
        sts.clear();
    }
    void append(int x) {
        cnt[x]++;
        maxFreq = max(maxFreq, cnt[x]);
        sts[cnt[x]].push(x);
    }
    int pop() {
        int maxKey = maxFreq;
        int x = sts[maxKey].top();
        sts[maxKey].pop();
        if(sts[maxKey].size() == 0){
            sts.erase(maxKey);
            maxFreq--;
        }
        cnt[x]--;
        return x;
    }
};

main(){
    FreqStack ob;
    ob.append(7);
    ob.append(9);
    ob.append(7);
    ob.append(9);
    ob.append(6);
    ob.append(7);
    cout << (ob.pop()) << endl;
    cout << (ob.pop()) << endl;
    cout << (ob.pop()) << endl;
    cout << (ob.pop()) << endl;
}

ইনপুট

ob.append(7); ob.append(9); ob.append(7); ob.append(9); ob.append(6); ob.append(7); cout << (ob.pop()) << endl; cout << (ob.pop()) << endl; cout << (ob.pop()) << endl; cout << (ob.pop()) << endl;

আউটপুট

7 9 7 6
  1. L = {0ⁿ1ᵐ2ᵐ3ⁿ | m,n = 0} ভাষার জন্য পুশডাউন অটোমেটা নির্মাণ C++-এ

  2. L = {0ᵐ1⁽ⁿ⁺ᵐ⁾2ⁿ | m,n = 0} ভাষার জন্য পুশডাউন অটোমেটা নির্মাণ C++-এ

  3. L = {0⁽ⁿ⁺ᵐ⁾1ᵐ2ⁿ | m,n = 0} ভাষার জন্য পুশডাউন অটোমেটা নির্মাণ C++-এ

  4. C++ STL-এ স্ট্যাক (Stack)