スタックとキューの記述を過度に簡略化するために、どちらもチェーンの一方の端からアクセスできる情報要素の動的チェーンであり、それらの間の唯一の実際の違いは次の事実です。
スタックで作業するとき
- チェーンの一端に要素を挿入し、
- チェーンの同じ端から要素を取得または削除します
キューで
- チェーンの一端に要素を挿入し、
- もう一方の端からそれらを取得/削除する
注:このコンテキストでは、retrieve / removeの抽象的な表現を使用しています。これは、要素をチェーンから取得する場合や、ある意味で要素を読み取るかその値にアクセスする場合がありますが、要素を要素から削除する場合もあります。チェーンと最後に、同じ呼び出しで両方のアクションを実行する場合があります。
また、エレメントという単語は、架空のチェーンを可能な限り抽象化し、特定のプログラミング言語の用語から切り離すために意図的に使用されています。elementと呼ばれるこの抽象的な情報エンティティは、言語に応じて、ポインタ、値、文字列または文字、オブジェクトなど、何でもかまいません。
ほとんどの場合、実際には値またはメモリの場所(つまりポインタ)です。そして、残りはこの事実を言語専門用語の背後に隠しているだけです<
キューは、要素の順序が重要で、要素が最初にプログラムに入ったときとまったく同じである必要がある場合に役立ちます。たとえば、オーディオストリームを処理するときや、ネットワークデータをバッファするときなどです。または、任意のタイプのストアアンドフォワード処理を行う場合。これらのすべてのケースで、要素のシーケンスをプログラムに入ったときと同じ順序で出力する必要があります。そうしないと、情報が意味をなさなくなる可能性があります。そのため、入力からデータを読み取り、処理を実行してキューに書き込む部分と、キューからデータを取得して別のキューに格納し、さらに処理または送信する部分でプログラムを分割できます。 。
スタックは、プログラムの直接のステップで使用される要素を一時的に格納する必要がある場合に役立ちます。たとえば、プログラミング言語は通常、スタック構造を使用して変数を関数に渡します。彼らが実際に行うことは、関数の引数をスタックに格納(またはプッシュ)してから、関数にジャンプして、スタックから同じ数の要素を削除および取得(またはポップ)します。このように、スタックのサイズは、関数のネストされた呼び出しの数に依存します。さらに、関数が呼び出されてその機能が終了すると、スタックは呼び出される前とまったく同じ状態になります。このようにして、他の関数がスタックで動作する方法を無視して、任意の関数がスタックで動作できます。
最後に、同じような類似の概念には他にも使用されている用語があることを知っておく必要があります。たとえば、スタックはヒープと呼ばれます。これらの概念のハイブリッドバージョンもあります。たとえば、両端キューは、両端から同時にアクセスできるため、スタックとキューとして同時に動作できます。さらに、データ構造がスタックまたはキューとして提供されるという事実は、それが必ずしもそのように実装されていることを意味するわけではなく、データ構造を任意のものとして実装し、特定のものとして提供できる場合があります。データ構造は、単にそのように動作させることができるためです。つまり、データ構造にプッシュとポップのメソッドを提供すると、それらは魔法のようにスタックになります!