JavaScriptはスタック構造の詳細なプロセスを実装する

JavaScriptはスタック構造の詳細なプロセスを実装する

1. スタック構造を理解する

配列は一般的なデータ構造であり、配列内の任意の位置にデータを挿入したり削除したりできることはご存じのとおりです。ただし、特定の機能を実現するために、この任意性を制限しなければならない場合もあります。スタックとキューは、比較的一般的な制限付きデータ構造です。まずはスタックを見てみましょう。
stack 、後入れ先出し ( LIFO ) 順序を持つ制限された線形テーブルです。

  • 制限は、挿入および削除操作がテーブルの一方の端でのみ許可されることです。この端はスタックの上部と呼ばれ、もう一方の端はスタックの下部と呼ばれます。
  • LIFO (後入れ先出し) とは、最後に入力された要素がスタック スペースから最初にポップされることを意味します。
  • スタックに新しい要素を挿入することを、プッシュ、プッシュ、またはプッシュとも呼びます。これは、新しい要素をスタックの最上位要素の上に配置し、それをスタックの新しい最上位要素にします。
  • スタックから要素を削除することは、スタックの作成またはスタックのポップとも呼ばれます。スタックの最上位の要素を削除し、その隣接する要素をスタックの新しい最上位の要素にします。

構造図は以下のとおりです。

人生における積み重ねに似ている

たとえば、コードを入力しているときにエラーが発生して削除する必要がある場合、最初に入力したコードが最後に削除されます。

次に、スタック構造のカプセル化を一緒に実装してみましょう。採用するメソッドは配列に基づいています。

2. スタック構造のカプセル化

まず、スタック構造をカプセル化するクラスを次のように作成します。

関数 Stack(){
            
        }

その中にプロパティとメソッドを追加し、プロパティ メソッドを通じてクラスに配列を追加します。次に、プロトタイプ メソッドを使用して、よく使用される操作を追加します。

スタックに対する一般的な操作は次のとおりです。

  • push (要素): スタックの一番上に新しい要素を追加します。
  • pop() : スタックの一番上の要素を削除する
  • peek( ) : スタックを変更せずにスタックの一番上の要素を返します。
  • isEmpty() : スタックが空かどうかを判定します。スタックに要素がない場合はtrueを返し、そうでない場合はfalseを返します。
  • size() : スタック内の要素数を返す
  • toString() : スタック構造の内容を文字として返します

次に、これらを 1 つずつ実装します。

 関数 Stack(){
     this.items = [];
     // スタックの先頭に新しい要素を追加します。押す()
     Stack.prototype.push = function(要素){
        this.items.push(要素);
     }
      // スタックの一番上の要素を削除する pop()
     Stack.prototype.pop = function(){
         this.items.pop() を返します。
     }
     // スタックを変更せずにスタックの一番上の要素を返す peek()
     Stack.prototype.peek = 関数(){
         this.items[this.items.length-1]を返します。
     }
     // スタックが空かどうかを判定する isEmpty()
     Stack.prototype.isEmpty = 関数(){
         (this.items.length == 0)の場合{
             true を返します。
         }それ以外 {
             false を返します。
         }
     }
     // スタック内の要素数を返す size()
     Stack.prototype.size = function(){
         this.items.length を返します。
     }
     // スタック構造の内容を文字として返す toString()
     Stack.prototype.toString = 関数(){
         var str = '';
         for(var i =0;i<this.items.length;i++){
             str += this.items[i] + ' ';
         }
         str を返します。
     }
 }
       


注:ここでプロトタイプを通じて追加する必要があるのはなぜでしょうか?これは、このメソッドを通じて追加されたメソッドがクラスに追加されるためであり、これを直接追加すると、特定のインスタンスのオブジェクトに追加され、メモリの無駄が発生します。

最後に確認します。コードは次のとおりです。

var スタック = 新しい Stack();
スタックをプッシュします(1);
スタックをプッシュします(2);
スタックをプッシュします(3);
スタックをプッシュします(4);
スタックをプッシュします(5);
console.log(スタック);
console.log('削除されたスタックの一番上の要素は: '+stack.pop());
console.log('スタックの最上位要素は: '+stack.peek());
console.log('スタックは空ですか: '+stack.isEmpty());
console.log('スタック内の要素数は: ' + stack.size());
console.log('スタック構造の内容は次のとおりです:');
コンソールにログ出力します。

出力は次のようになります。

ビルドに成功しました。
例を見てみましょう!

3. 10進数を2進数に変換する

10進数を2進数に変換するにはどうすればいいですか?

10 進数を 2 進数に変換するには、10 進数を 2 で割り、結果が 0 になるまで余りをスタックにプッシュし、最後にスタック内の要素を 1 つずつポップして最終結果を取得します。

次の図に示すように:

具体的なコードは次のとおりです。

 関数 Stack(){
     this.items = [];
     //スタックにプッシュする Stack.prototype.push = function(element){
         this.items.push(要素);
     }
     //ポップアウト Stack.prototype.pop = function(){
         this.items.pop() を返します。
     }
     //スタックが空かどうかを判断します Stack.prototype.isEmpty = function(){
         (this.items.length == 0)の場合{
             true を返します。
         }それ以外{
             false を返します。
         }
     }
 }
 関数decToBin(decNumber){
      var stack = 新しい Stack;
      while(decNumber>0){
          // 剰余を取得してスタックに格納します。stack.push(decNumber%2);
          //新しい除数を取得します。decNumber = Math.floor(decNumber/2);
      }
      //スタックの一番上の要素を取得します。var str = '';
      while(!stack.isEmpty()){
          str += スタック.pop();
      }
      str を返します。
  }
 console.log('100 をバイナリに変換すると次のようになります: '+decToBin(100));
 console.log('50 をバイナリに変換すると次のようになります: '+decToBin(50));
 console.log('20 をバイナリに変換すると次のようになります: '+decToBin(20));
 console.log('34 をバイナリに変換すると次のようになります: '+decToBin(34));

出力は次のようになります。

JavaScriptのスタック構造の実装の詳細なプロセスに関するこの記事はこれで終わりです。JavaScript のスタック構造の実装に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScriptでスタック構造を実装するプロセスの詳細な説明
  • JS アルゴリズムとデータ構造におけるスタック例の詳細な説明
  • JS スタッククラスの実装と使用例
  • JavaScript データ構造スタックの使用例

<<:  9999px に別れを告げる新しい CSS 画像置換テクニック (背景表示と画面外へのテキストの移動)

>>:  HTML でテキスト ボックスのプロンプト機能を実装するさまざまな方法

推薦する

Windows での Nginx のインストールと環境設定 (nginx をサービスとして実行)

最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...

Linux CentOS6.5 yum インストール mysql5.6

この記事では、Linux yumを使用してmysql5.6をインストールする簡単な手順を参考までに紹...

Vue+js はビデオのフェードインとフェードアウト効果を実現します

Vue+jsはビデオのフェードインとフェードアウトを実現します。参考までに、具体的な内容は次のとおり...

Docker 学習: コンテナ コンテナの具体的な使用方法

コンテナは Docker のもう一つの中心的な概念です。簡単に言えば、コンテナとは、独立して実行され...

goaccess を使用して nginx ログを分析する詳細な方法

最近、goaccess を使って nginx ログを分析したいのですが、nginx ログの設定形式が...

Linuxでプロセスが占有するポート番号を表示する

Linux システム管理者にとって、サービスがポートに正しくバインドされているか、またはポートをリッ...

HTMLを教える記事

アーティストになるつもりがない場合は、開発者として HTML を読んで、必要に応じて簡単な変更を加え...

Centos で MySQL パスワードを変更する方法

1. MySQL ログイン設定を変更します。 # vim /etc/my.cnf文を追加: skip...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

MySQL で行を列に変換したり、列を行に変換したりする詳細な例

mysql 行から列へ、列から行へ難しい文章ではないので、詳しく説明はしません。文章を読むときは、一...

CentOS で LibreOffice を使用してドキュメント形式を変換する方法

プロジェクト要件では、アップロードされたドキュメントの前処理が必要です。ユーザーが doc 形式でド...

MySQL Installer Community 5.7.16 インストール詳細チュートリアル

この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...

Linux Jenkins 構成スレーブノード実装プロセス図

序文: Jenkins のマスター スレーブ分散アーキテクチャは、主に、Jenkins に単一ポイン...

Vueのハッシュジャンプ原理の詳細な説明

目次ハッシュと履歴の違いハッシュ履歴getCurrentLocation の実装setupListe...

プロジェクトに必須の 8 つの JavaScript コード スニペット

目次1. ファイル拡張子を取得する2. コンテンツをクリップボードにコピーする3. スリープ時間は何...