JavaScriptキュー構造Queはプロセス解析を実現します。


一、行列案内
キューは制限された線形表であり、先入れ先出し(FIFO:first in first out)が特徴である。
制限されているのは、表の先端のみで削除操作が許可されていることです。表のバックエンドに挿入操作を行います。

列に並んで切符を買うのと同じです。先に来たのは先に切符を買います。後から切符を買います。

キューのアプリケーション:
印刷キュー:複数のファイルをコンピュータで印刷する場合は、整列印刷が必要です。スレッドキュー:マルチスレッドを開くと、新しいスレッドが必要なリソースが足りない場合は、先にスレッドキューに入れて、CPU処理を待つ。
キュークラスの実装:
キューの実装はスタックと同じで、2つの案があります。
配列に基づいて実現する。チェーンに基づいて実現する;
キューの一般的な操作:
  • enqueue(element):新しいエントリをキューの末尾に追加します。
  • dequeue():列の最初のエントリを削除し、削除された要素を返します。
  • front():キューに戻る最初の要素――最初に追加されても、最初に除去される要素である。キューは何も変更されません(要素を除去せずに、要素情報だけを元に戻すのはStck類のpeek方法と非常に似ています)。
  • isEmpty():もしキューに要素が含まれていないなら、trueに戻ります。そうでなければfalseに戻ります。
  • size():キューに戻る要素の個数は、配列のlength属性と類似している。
  • toString():キューの内容を文字列形式に変換する。
  • 二、パッケージクラス
    2.1.コード実現
    
      //          
      function Queue() {
      //   
       this.items = []
       
      //   
      // 1.enqueue():         
      Queue.prototype.enqueue = element => {
       this.items.push(element)
      }
    
      // 2.dequeue():          
      Queue.prototype.dequeue = () => {
       return this.items.shift()
      }
    
      // 3.front():       
      Queue.prototype.front = () => {
       return this.items[0]
      }
    
      // 4.isEmpty:        
      Queue.prototype.isEmpty = () => {
       return this.items.length == 0;
      }
    
      // 5.size():          
      Queue.prototype.size = () => {
       return this.items.length
      }
    
      // 6.toString():              
      Queue.prototype.toString = () => {
       let resultString = ''
        for (let i of this.items){
         resultString += i + ' '
        }
        return resultString
       }
      }
    テストコード:
    
      //     
      let queue = new Queue()
    
      //          
      queue.enqueue('a')
      queue.enqueue('b')
      queue.enqueue('c')
      queue.enqueue('d')
      console.log(queue);                       //58
    
      //         
      queue.dequeue()
      console.log(queue);                       //62
      queue.dequeue()
      console.log(queue);                       //64
    
      //front
      console.log(queue.front());                   //67
      
      //       
      console.log(queue.isEmpty());                  //70
      console.log(queue.size());                   //71
      console.log(queue.toString());                 //72
    テスト結果:

    2.2.キューの適用
    行列を使ってゲームを実現します。太鼓をたたいて花を伝えて、データと設定の数字numに入ってきて、配列内の要素を巡回して、遍歴した元素が指定の数字numの時にこの元素を削除して、配列が一つの要素が残ります。
    コードの実装:
    
      //     :   :    
      let passGame = (nameList, num) => {
       //1.      
       let queue = new Queue()
    
       //2.          
       //   ES6 for    ,i   nameList[i]
       for(let i of nameList){
        queue.enqueue(i)
       }
       
    
       // 3.    
       while(queue.size() > 1){//     1       
       //   num   ,        
       //  num   ,        
       // 3.1.num               (              )
       for(let i = 0; i< num-1; i++ ){
        queue.enqueue(queue.dequeue())
       }
       // 3.2.num     ,        
       /*
              ,                         ,    , num   num-1              ,   num             ,      dequeue      
       */
       queue.dequeue()
       }
    
       //4.        
       console.log(queue.size());                  //104
       let endName = queue.front()
       console.log('      :' + endName);            //106  
       
       return nameList.indexOf(endName);
      }
    
      //5.      
      let names = ['lily', 'lucy', 'Tom', 'Lilei', 'Tony']
      console.log(passGame(names, 3));                //113
    テスト結果:

    三、優先列
    優先順位のキューが主に考慮される問題は以下の通りです。
    各要素はもう一つのデータではなく、データの優先度も含んでいます。データを追加する過程で、優先度によって正しい位置に入れます。3.1優先順位行列の実現
    コードの実装:
    
      //        
      function PriorityQueue() {
    
       //   :          ;         
       function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority;
       } 
    
       //     
       this.items = []
    
       // 1.           
       PriorityQueue.prototype.enqueue = (element, priority) => {
        // 1.1.  QueueElement  
        let queueElement = new QueueElement(element, priority)
    
        // 1.2.        
        if(this.items.length == 0){
         this.items.push(queueElement)
        }else{
         //                   
         let added = false
         for(let i of this.items){
          //                    (priority  ,     )
          if(queueElement.priority < i.priority){
           this.items.splice(i, 0, queueElement)
           added = true
           //                 break    
           break
          }
         }
         //          ,           
         if(!added){
          this.items.push(queueElement)
         }
        }
       }
    
       // 2.dequeue():          
       PriorityQueue.prototype.dequeue = () => {
        return this.items.shift()
       }
    
       // 3.front():       
       PriorityQueue.prototype.front = () => {
        return this.items[0]
       }
    
       // 4.isEmpty():        
       PriorityQueue.prototype.isEmpty = () => {
        return this.items.length == 0;
       }
    
       // 5.size():          
       PriorityQueue.prototype.size = () => {
        return this.items.length
       }
    
       // 6.toString():              
       PriorityQueue.prototype.toString = () => {
        let resultString = ''
         for (let i of this.items){
          resultString += i.element + '-' + i.priority + ' '
         }
         return resultString
        }
      }
    テストコード:
    
      //     
      let pq = new PriorityQueue();
      pq.enqueue('Tom',111);
      pq.enqueue('Hellen',200);
      pq.enqueue('Mary',30);
      pq.enqueue('Gogo',27);
      //              
      console.log(pq);
    テスト結果:

    3.2.注意点
    配列方法のspliceの使い方について:
    splice(1,0,'Tom'):インデックスが1の要素の前に要素'Tom'(インデックスが1の要素から削除し、0の要素を削除し、インデックスが1の要素の前に要素'Tom'を追加するという意味もあります。
    splice(1,1,'Tom'):インデックスが1の要素から削除(インデックスが1の要素を含む)し、要素を1つ削除し、要素'Tom'を追加します。索引の1の要素を要素'Tom'に置き換えます。
    配列のpush方法は、配列、スタック、およびキューの形態である:
  • 配列:配列[0,1,2]において、ポップ(3)、結果は[0,1,2,3]である。
  • スタック:pop(0)、pop(1)、pop(2)、pop(3)を実行し、スタック底からスタックトップまでの要素はそれぞれ:0、1、2、3;配列として参照すれば、[0,1,2,3]と書くことができますが、インデックスが3の要素3は実はスタックトップ要素です。したがって、スタックのpush方法は、スタックの一番上に要素を追加することである(ただし、配列の視点では配列の最後に要素を追加することである)。
  • 列:enqueue方法は、配列のpush方法によって実現されてもよく、配列の最後に要素を追加するのと同じである。
  • スタック構造は、下向き(インデックス値が下から上へ増加する)の配列構造であると考えられています。

    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。