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

C++でインクリメント操作を使用してスタックを設計する


次の操作をサポートするスタックを設計するとします。

  • CustomStack(int maxSize)これは、スタック内の要素の最大数であるmaxSizeでオブジェクトを初期化するか、スタックがmaxSizeに達した場合は何もしません。

  • void push(int x)これは、スタックがmaxSizeに達していない場合に、スタックの一番上にxを挿入します。

  • int pop()これにより、スタックの最上位が削除されて返されます。スタックが空の場合は-1が返されます。

  • void inc(int k、int val)これは、スタックの一番下のk要素をvalだけインクリメントします。スタック内の要素がk未満の場合は、スタック内のすべての要素をインクリメントするだけです。

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

  • 2つの配列stとincを定義し、1つの整数型データキャップを作成します

  • イニシャライザで、cap:=Nを設定し、inc:=サイズN+10の新しい配列を設定します

  • push(x)メソッドの場合、スタックのサイズが上限でない場合は、xをstに挿入します。

  • pop()操作は-

    のようになります
  • stが空の場合は、-1を返します

  • それ以外の場合

    • スタックのトップ:=スタックのトップ+inc[スタックのトップインデックス]

    • スタックに要素がある場合は、inc [size of st –2]をinc[size of st – 1]

      だけ増やします。
    • inc [sのサイズ-1]:=0

    • x:=stの最後の要素

    • xを返す

  • inc()メソッドは次のように機能します-

  • kを1減らします

  • k:=kの最小値とstのサイズ– 1

  • k <0の場合、戻ります

  • inc[k]をvalだけ増やします。

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class CustomStack {
public:
   vector <int> st;
   vector <int> inc;
   int cap;
   CustomStack(int N) {
      cap = N;
      inc = vector <int>(N + 10);
   }
   void push(int x) {
      if(st.size() == cap) return;
      st.push_back(x);
   }
   int pop() {
      if(st.empty()) return -1;
      else{
         st.back() += inc[st.size() - 1];
         if(st.size() - 1 > 0 ){
            inc[st.size() - 2] += inc[st.size() - 1];
         }
         inc[st.size() - 1] = 0;
         int x = st.back();
         st.pop_back();
         return x;
      }
   }
   void increment(int k, int val) {
      k--;
      k = min(k, (int)st.size() - 1);
      if(k < 0) return;
      inc[k] += val;
   }
};
main(){
   CustomStack ob(3);
   ob.push(1);
   ob.push(2);
   cout << ob.pop() << endl;
   ob.push(2);
   ob.push(3);
   ob.push(4);
   ob.increment(5, 100);
   ob.increment(2, 100);
   cout << ob.pop() << endl;
   cout << ob.pop() << endl;
   cout << ob.pop() << endl;
   cout << ob.pop() << endl;
}

入力

See the main() in the program

出力

2
103
202
201
-1

  1. C++で合計Sを持つ素数Pの後の素数

    この問題では、合計S、素数P、およびNの3つの数が与えられます。私たちのタスクは、合計がSに等しいPより大きいN個の素数をすべて見つけることです。 私たちの問題を理解するために例を見てみましょう Input: N = 2, P = 5, S = 18 Output: 7 11 Explanation: Prime numbers greater than 5 : 7 11 13 Sum = 7 + 11 = 18 この問題を解決するには、PとSの間のすべての素数を見つける必要があります。次に、合計がSになるN個の素数を見つけます。このためにバックトラッキングを使用します。 ソリューション

  2. C++の行列に奇数値を持つセル

    行列の次元であるnとmがあるとします。これらはゼロで初期化されます。そして、インデックスは、indexes [i] =[ri、ci]で与えられます。 [ri、ci]の各ペアについて、行riと列ciのすべてのセルを1ずつインクリメントする必要があります。出力は、すべてのインデックスに増分を適用した後、マトリックス内の奇数値を持つセルの数になります。 これを解決するには、次の手順に従います- 奇数:=0、およびx:=行列の行数を初期化します マトリックスマットを作成する 0からxの範囲のiの場合 r =input [i、0]、c =input [i、1]、 0からm–1の範囲のjの場合 m