Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมสร้าง Frequency Stack ใน C++


สมมติว่าเราต้องการสร้างหนึ่งสแต็กที่เรียกว่า FrequencyStack ของเรา FrequencyStack มีสองหน้าที่ -

  • append(x) ซึ่งจะต่อท้ายหรือส่งค่า x ลงบนสแต็ก

  • pop() สิ่งนี้จะลบและส่งคืนองค์ประกอบที่บ่อยที่สุดในสแต็ก หากมีองค์ประกอบมากกว่าหนึ่งองค์ประกอบที่มีความถี่เท่ากัน องค์ประกอบที่ใกล้กับส่วนบนสุดของสแต็กจะถูกลบออกและส่งคืน

ดังนั้น หากอินพุตเป็นเหมือนผนวกองค์ประกอบบางอย่าง เช่น 7, 9, 7, 9, 6, 7 จากนั้นดำเนินการป๊อปอัปสี่ครั้ง ผลลัพธ์จะเป็น 7,9,7,6 ตามลำดับ

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดหนึ่งแผนที่ cnt

  • กำหนดหนึ่ง sts แผนที่

  • maxFreq :=0

  • กำหนดฟังก์ชัน append() ซึ่งจะใช้ x

  • (เพิ่ม cnt[x] ขึ้น 1)

  • maxFreq :=สูงสุดของ maxFreq และ cnt[x]

  • แทรก x ลงใน sts[cnt[x]]

  • กำหนดฟังก์ชัน pop()

  • maxKey :=maxFreq

  • x :=องค์ประกอบด้านบนของ sts[maxKey]

  • ลบองค์ประกอบออกจาก sts[maxKey]

  • ถ้าขนาดของ sts[maxKey] เท่ากับ 0 แล้ว −

    • ลบ maxKey ออกจาก sts

    • (ลดความถี่สูงสุดลง 1)

  • (ลด cnt[x] ลง 1)

  • ผลตอบแทน 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