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

C++で指定された操作で最大スタックを構築するプログラム


次の操作をサポートする最大スタックを作成するとします-

  • MaxStk()これにより、最大スタックの新しいインスタンスが構築されます

  • push(val)はvalをスタックに挿入します

  • top()は、スタックから最上位の要素を取得します

  • max()はスタックから最大の要素を取得します

  • pop()は、スタックから最上位の要素を削除して返します

  • popmax()は、スタックから最大の要素を削除して返します

次に、MasStk()を呼び出して最大スタックを構築し、5、15、10などの3つの値をプッシュしてから、それぞれtop()、max()、popmax()、max()pop()、top()関数を呼び出します。その場合、初期スタックステータスは[5、15、10]になり、関数に対応する出力は10、15、15、10、10、5

になります。

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

  • pos_index:=0

  • 1つのセットstkを別のセットauxに定義する

  • コンストラクターを定義します。これは特別なタスクを実行していません

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

  • pos_index、valをstkに挿入します

  • val、pos_indexをauxに挿入します

  • (pos_indexを1増やします)

  • 関数top()を定義する

  • stkが空の場合、-

    • -1を返す

  • stkの最初のアイテムの2番目の値を返す

  • 関数max()

    を定義します
  • auxが空の場合、-

    • -1を返す

  • auxの最初のアイテムの最初の値を返す

  • 関数pop()

    を定義します
  • stkが空の場合、-

    • -1を返す

  • id:=stkの最初のアイテムの最初の値、ret=stkの最初のアイテムの2番目の値

  • stkの最初の要素をstkから削除する

  • auxからペア(ret、id)を削除する

  • retを返す

  • 関数popmax()

    を定義します
  • auxが空の場合、-

    • -1を返す

  • ret:=auxの最初のアイテムの最初の値、id=auxの最初のアイテムの2番目の値

  • auxの最初の要素をauxから削除する

  • stkからpair(id、ret)を削除する

  • retを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class MaxStk {
   int pos_index = 0;
   set<pair<int, int>, greater<>> stk, aux;
   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;
}

入力

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

  1. 特定の操作で各都市から訪問できる都市の数をカウントするC++プログラム

    (xi、yi)の形式でN個の座標点Pのリストがあるとします。 x値とy値は、最初のN個の自然数の順列です。 1からNの範囲のkごとに。都市kにいます。操作は何度でも任意に適用できます。操作:現在の都市よりもx座標が小さく、y座標が小さい、またはx座標が大きい、またはy座標が大きい別の都市に移動します。都市kから到達できる都市の数を見つける必要があります。 。 したがって、入力がP =[[1、4]、[2、3]、[3、1]、[4、2]]の場合、出力は[1、1、2、2] ステップ これを解決するには、次の手順に従います- n := size of P Define one 2D array ls

  2. 特定の条件でグラフを作成するC++プログラム

    NとKの2つの数があるとします。N個の要素を持つ無向グラフがあるとします。 N個の頂点は次の条件を満たす- グラフはシンプルで接続されています 頂点には1からNまでの番号が付けられています グラフのエッジの数をMとします。エッジには1からMまでの番号が付けられます。エッジの長さは1です。エッジiは頂点U[i]を頂点V[i]に接続します。 頂点のペア(i、j)は正確にKペアあり、i