データ構造 - キュースタックと

1.スタック

スタックは、最後に、最初のアウト(LastInFirstOut)データ構造です。これは、アナログアレイのプッシュとポップ操作によって達成することができます。

前記プッシュおよびポップアルゴリズムの複雑さはO(1)であります

2.キュー

キューは、先入れ先出しのデータ構造(FirstInFIrstOut)データ構造です。プッシュシフト操作は、本質的に配列されます。

しかし、アルゴリズムの複雑さはシフト方式O(N)です。

キューの1建設

あなたはあなた自身のキューデータ構造を実装することができます

{キュークラス
  コンストラクタ(MAX = 100 ){
     この .DATA = 配列(MAX);
     この .P = 0; // エンキューポインタ、次のデータの点が挿入される場所
    この .Q = 0; // デキューポインタ、現在のキューの最初のデータの場所
    この .MAX =マックス; // maxはのキューの最大容量を指し
    、この .size = 0; // 最初のキューが空である
  }
   // ヘッドの動作読み出し
  PEEK(){ 
    CONSTをアイテム = この .DATA [ この.Q];
     戻り項目; 
  } 
  // エンキュー操作
  エンキュー(値){
     IFこの=== .size この{).MAXを
       // キューのオーバフロー、例外をスローするか、他の操作を行うことができる
      スロー 新しい新しいエラー(「キューのオーバーフロー」
    } 
    この [.DATAをこの .P ++] = 値;
     この .sizeを++ ;
     IFこの .P === .MAX){
       この .P = 0 ; 
    } 
  } 
  // デキュー-デキューリターンデータ
  デキュー(){
     IFこの .size === 0 ){
       // キュー逆オーバーフロー:あなたが例外をスローしたり、他の操作を行うことができます
      スロー 新しい新しいエラー(「キューアンダーフロー」
    } 
    のconstアイテム = この .DATA [ この.Q];
     この .DATA [ この .Q ++] =未定義; // 値が不定に対応する位置に設定されている
    この .size-- ;
     IFこの .Q === 。 MAX){
       この .Q = 0; // アウト範囲の開始位置
    }
     戻り項目; 
  } 
}

例:

/ * * 
転位によって円軌道を鉄道車両、順序はターゲットを得ることができるか否かが判定される。
[1,2,3,4,5] => [1,5,2,3,4] 
                   | --4 -3-2-1 --- |一時的なトラック(キュー)
                   | | 
[5] [4] [3] [2] [1] ---- |。5 ---- ------- | --------- [4] [3] [2] [5] [1]配列に対応する[1,5,2,3,4] 
* /
実際の状況の分析は、配置はFIFO、キューデータ構造があるべきことができます。
関数リゾート(オリジナル、ターゲット){
   // キューが元の位置に対応し、そしてシフトから元のデータと一致する場合、値が(目標キューを横断し)、この値
  // そうでない場合には、元の系列データに対応するグローバル値の前一時キューに格納されます。
  //は、一時的なキューを横断し続ける、または値は、元の残差キューとターゲットの最初の位置に対応するキューの値、シフト()一致する場合
  // 最終結果を一時キューが空である場合は、その証明できる 
  せtempQueue = 新しい新しいキュー( original.size);
   のため(LET Xのtarget.data){
     IF(X === tempQueue.peek()){ 
      tempQueue.dequeue(); 
    } そう IF(original.size === 0 ){
       戻り tempQueueを。 === 0サイズ
    } 
    LET Y = NULL ;
     一方(!original.size> 0 &&((Y = original.dequeue())== X)){ 
      tempQueue.enqueue(Y)。
    } 
  } 
  戻り tempQueue.size === 0。// 如果取值tempQueue.data 
}

テストケース:

// 测试用例 
CONST ARR1 = [1,2,3,4,5 ]。
CONST ARR2 = [1,3,2,4,5]。// 
// CONST ARR2 = [5,4,3,2,1]。//偽
// constのARR2 = [1,5,2,3,4]; //真
// CONST ARR2 = [1,5,2,4,3]。//偽 
のconst QUEUE1 = 新しいキュー(arr1.length)。
constのキュー2 = 新しいキュー(arr2.length)。
ため(I = 0せ; I <arr1.length; I ++ ){ 
  queue1.enqueue(ARR1 [i])と
  queue2.enqueue(ARR2 [I])
} 

はconsole.log(リゾート(QUEUE1、キュー2))。

キューの適用に関する事項

幅優先探索を実装する1

2.生産 - 消費者モデル

3.バッファ領域(例えば、キーボードバッファーなど)

4.プライオリティキュー

 

おすすめ

転載: www.cnblogs.com/lyraLee/p/12160162.html