C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での最大周波数スタック


FreqStackと呼ばれる1つのスタックを実装したいとします。FreqStackには2つの関数があります-

  • push(x)、これは整数xをスタックにプッシュします。

  • pop()、これはスタック内で最も頻繁な要素を削除して返します。同じ頻度の要素が複数ある場合は、スタックの最上位に最も近い要素が削除されて返されます。

したがって、入力が7、9、7、9、6、7などの要素をプッシュするようなものである場合、ポップ操作を4回実行すると、出力はそれぞれ7、9、7、6になります。

これを解決するには、次の手順に従います-

  • 1つのマップcntを定義する

  • 1つのマップstsを定義する

  • maxFreq:=0

  • 関数push()を定義します。これにはxが必要です

  • (cnt [x]を1増やします)

  • maxFreq:=maxFreqとcnt[x]

    の最大値
  • xをsts[cnt[x]]

    に挿入します
  • 関数pop()

    を定義します
  • maxKey:=maxFreq

  • x:=sts [maxKey]

    の最上位要素
  • sts [maxKey]

    から要素を削除します
  • sts [maxKey]のサイズが0と同じ場合、-

    • stsからmaxKeyを削除する

    • (maxFreqを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 push(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.push(7);
   ob.push(9);
   ob.push(7);
   ob.push(9);
   ob.push(6);
   ob.push(7);
   cout << (ob.pop()) << endl;
   cout << (ob.pop()) << endl;
   cout << (ob.pop()) << endl;
   cout << (ob.pop()) << endl;
}

入力

push elements 7, 9, 7, 9, 6, 7, then call pop() four times.

出力

7
9
7
6

  1. C ++ STL(3.5)でスタック

    C ++ STLでは、スタックはLIFO構造として実装されるコンテナーとして使用されます。 LIFOは後入れ先出しを意味します。 Stackは、本が上下に並べられた本の山と見なすことができ、最後に挿入された本が最初に削除されるため、LIFO構造と呼ばれます。 スタックに関連付けられている操作は- Top() -この関数は、スタックの最上位要素への参照を返します。 構文 --name_of_stack.top() パラメータ -パラメータなし 戻り値 -スタックコンテナの最上位要素への参照 Push() -この関数は、要素をスタックコンテナに挿入するために使用されま

  2. C#のStack.Push()メソッド

    C#のStack.Push()メソッドは、スタックの一番上にオブジェクトを挿入するために使用されます。 構文 構文は次のとおりです- public virtual void Push (object ob); 上記のパラメータobは、スタックにプッシュするオブジェクトです。 例 例を見てみましょう- using System; using System.Collections; public class Demo {    public static void Main() {       Stack stack = new Stack(