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