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

C++でスタックシーケンスを検証する


2つのシーケンスが異なる値でプッシュおよびポップされたとすると、これが最初は空のスタックでのプッシュおよびポップ操作のシーケンスの結果である可能性がある場合にのみ、trueを見つける必要があります。したがって、入力がpush =[1,2,3,4,5]、pop =[4,5,3,2,1]の場合、出力はtrueになります。 push(1)、push(2)、push(3)、push(4)、pop():4、push(5)、pop():5、pop():3、pop():を使用できます。 2、pop():1

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

  • Solve()という1つのメソッドを作成します。これには、プッシュおよびポップされた配列が必要です

  • スタックstを定義し、インデックスを設定します:=0

  • 0からプッシュされた配列のサイズまでの範囲のiの場合

    • push push [i] into st

    • popped [index] =スタックトップ要素の場合、

      • インデックス:=インデックス+ 1

      • スタックからポップ

      • stが空ではなく、popped [index] =top of st

        • インデックス:=インデックス+ 1

      • stから削除

  • インデックス<ポップのサイズ

    • popped [index] =スタックトップの場合、

      • インデックスを1増やします

      • スタックから削除

    • それ以外の場合はループから出てきます

  • スタックが空の場合はtrueを返します

  • この解決メソッドは、以下のようなメインセクションから呼び出されます-

  • リターンソルブ(プッシュ、ポップ)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool solve(vector<int>& pushed, vector<int>& popped){
      stack <int> st;
      int currentIndexOfPopped = 0;
      for(int i =0;i<pushed.size();i++){
         st.push(pushed[i]);
         if(popped[currentIndexOfPopped] == st.top()){
            currentIndexOfPopped++;
            st.pop();
            while(!st.empty() && popped[currentIndexOfPopped]==st.top()){
               currentIndexOfPopped++;
               st.pop();
            }
         }
      }
      while(currentIndexOfPopped <popped.size()){
         if (popped[currentIndexOfPopped]==st.top()){
            currentIndexOfPopped++;
            st.pop();
         }else{
            break;
         }
      }
      return st.empty();
   }
   bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
      Solution s;
      bool flag = s.solve(pushed, popped);
      return flag;
   }
};
main(){
   vector<int> v = {1,2,3,4,5};
   vector<int> v1 = {4,5,3,2,1};
   Solution ob;
   cout << (ob.validateStackSequences(v, v1));
}

入力

[1,2,3,4,5]
[4,5,3,2,1]

出力

1

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

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

  2. C++でバイナリツリーノードを検証する

    0からn-1までの番号が付けられたn個の二分木ノードがあり、ノードIに2つの子leftChild[i]とrightChild[i]があるとすると、次の場合にのみtrueと言う必要があります。指定されたすべてのノードは、正確に1つの有効な二分木を形成します。ノードiに左の子がない場合、leftChild [i]は-1に等しくなります。これは、右の子の場合と同様です。ノードには値がなく、この問題ではノード番号のみを使用することに注意する必要があります。したがって、入力が-のような場合 その後、出力はtrueになります。 これを解決するには、次の手順に従います- dfsというメソッド