スタックとキューの基本的な違いは何ですか?


130

スタックとキューの基本的な違いは何ですか?

私が違いを見つけることができないのを助けてください。

スタックとキューをどのように区別しますか?

私はさまざまなリンクで答えを検索し、この答えを見つけました。

高水準プログラミングでは、

スタックは、新しい要素を既存の要素の「上に」配置することによって長くなり、既存の要素の上部から要素を削除することによって短くなる要素のリストまたはシーケンスとして定義されます。これは、「プッシュ」と「ポップ」の数学演算を備えたADT [抽象データ型]です。

キューは、既存の要素の後ろに新しい要素を配置することで追加される要素のシーケンスであり、キューの前にある要素を削除することで短縮されます。ADT [抽象データ型]です。これらの用語には、Java、C ++、Pythonなどのプログラミングで理解できるものがあります。

より詳細な回答はありますか?私を助けてください。


12
あなたはあなた自身の質問に答えたようです-スタックは後入れ先出し(LIFO)コンテナーであり、キューは先入れ先出し(FIFO)コンテナーです。
イリジウム

回答:


151

スタックはLIFO(後入れ先出し)データ構造です。ウィキペディアへの関連リンクには、詳細な説明と例が含まれています。

キューはFIFO(先入れ先出し)データ構造です。ウィキペディアへの関連リンクには、詳細な説明と例が含まれています。


131

紙の山を想像してみてください。スタックに入れられた最後のピースが一番上にあるので、最初に出てきます。これがLIFOです。紙を追加することを「プッシュ」と呼び、紙を取り除くことを「ポップ」と呼びます。

店舗の行列を想像してみてください。ラインの最初の人は、ラインから外れる最初の人です。これはFIFOです。ラインに入った人は「キューに入れられ」、ラインから外れた人は「キューから取り出されます」。


3
私が考えることができる最高のアナロジーの1つ。
イエイケル2018

83

視覚モデル

パンケーキ スタック(LIFO)

1つを追加または削除する唯一の方法は、上からです。

パンケーキスタック

ライン キュー(FIFO)

人が到着すると、列の最後に到着し、列を出ると、列の前から離れます。

DMVライン

おもしろい事実:イギリスは人の列をキューと呼んでいます


6
ジー、これが答えのはずだ。ありがとう@Jacksonkr
Kulasangar

これはキューとスタックの完全な説明ですが、議論のために、最初のパンケーキをプレートに追加したい場合はどうでしょうか。これは、stack.size()とif(!stack.isEmpty())で完了できることはわかっていますが、それでも最初のパンケーキが一番良いかもしれません:)...どちらの方法でも、いい答えであり、これは同意します最も明確な...イギリスが行をキューとして参照していることは興味深いようですが(それが正確である場合)、非プログラミング言語では、最初のエントリが最初に(行/キューを終了した後に)離れる行と見なします。 )
ViaTech 2018

待って、他の場所ではキューと呼ばれていませんか?
遠足

37

どちらも、順序付けられたリスト(それらがリストに追加された時刻順に並べられたもの)と考えることができます。2つの主な違いは、新しい要素がリストに入り、古い要素がリストから出る方法です。

スタックの場合、リストa, b, cがあり、を追加するdと、最後にタックされるため、結果はになりa,b,c,dます。リストの要素をポップする場合は、最後に追加した要素であるを削除しdます。ポップの後、私のリストはa,b,c再びなりました

キューの場合も、同じ方法で新しい要素を追加します。追加後a,b,cとなります。しかし、今私がポップするとき、私はリストの前部から要素を取らなければならないので、それはになります。a,b,c,ddb,c,d

とても簡単です!


14

キュー

キューは、アイテムの順序付けられたコレクションです。

アイテムは、キューの「フロント」エンドと呼ばれる一端で削除されます。

アイテムは、キューの「リア」と呼ばれるもう一方の端に挿入されます。

最初に挿入されたアイテムが最初に削除されます(FIFO)。

スタック

スタックはアイテムのコレクションです。

1つのデータアイテム、つまり最後に挿入されたアイテムにのみアクセスできます。

アイテムは、「スタックのトップ」と呼ばれる一端で挿入および削除されます。

ダイナミックで常に変化するオブジェクトです。

すべてのデータ項目がスタックの一番上に置かれ、一番上から取り除かれます

このアクセスの構造は、後入れ先出し構造(LIFO)として知られています。


つまり、基本的に「キュー」は「FIFO」です-先入れ先出しキューです。「スタック」は「LIFO」ですが、先入れ先出しキューの最後です。私は正しいですか?
セバスチャンニールセン

@SebastianNielsenはい、答えの言及として正しい。
Dissanayake

しかし、リンクされたリストとスタックの違いは何ですか?同じではないですか?
セバスチャンニールセン2017年

@SebastianNielsenスタックはADTです。つまり、スタックはプッシュおよびポップ操作であるインターフェースを公開しますが、基になるメカニズム(実装)はエンドユーザーから隠されています。スタックは、配列またはリンクリストを使用して実装できます。
ジラヒチ

13

スタック:

  1. スタックは、スタックの一番上でのみ要素を挿入または削除できる要素のリストとして定義されます。
  2. スタックの動作は、後入れ先出し(LIFO)システムに似ています。
  3. スタックは、関数間でパラメーターを渡すために使用されます。関数の呼び出しでは、パラメーターとローカル変数がスタックに格納されます。
  4. 再帰をサポートするPascal、cなどの高水準プログラミング言語では、スタックを簿記に使用します。各再帰呼び出しでは、パラメーター、ローカル変数、および戻りアドレス(呼び出し後にコントロールが戻る必要があるアドレス)の現在の値を保存する必要があることに注意してください。

キュー:

  1. キューは、同じタイプの要素のコレクションです。これは線形リストであり、リストの後方と呼ばれるリストの一端で挿入が行われ、リストの前方と呼ばれる他端でのみ削除が行われます。
  2. キューの動作は、先入れ先出し(FIFO)システムに似ています。

スタックの最後または最初にも挿入できると確信しています。ここで重要なのはFIFOとLIFOです
Mike

6

スタックは要素のコレクションであり、一度に1つずつ格納および取得できます。要素は、格納時とは逆の順序で取得されます。つまり、格納されている最新の要素が、次に取得される要素です。スタックは、後入れ先出し(LIFO)または先入れ後出し(FILO)構造と呼ばれることがあります。以前に格納された要素は、最新の要素(通常は「トップ」要素と呼ばれる)が取得されるまで取得できません。

キューは要素のコレクションであり、一度に1つずつ保存および取得できます。要素は、格納された時間順に検索されます。つまり、最初に格納された要素が、次に取得される要素です。キューは、先入れ先出し(FIFO)または後入れ先出し(LILO)構造と呼ばれることもあります。その後格納された要素は、最初の要素(通常は「フロント」要素と呼ばれます)が取得されるまで取得できません。


2

スタック:スタックは、スタックの最上部でのみ要素を挿入または削除できる要素のリストとして定義されます

スタックは、関数間でパラメーターを渡すために使用されます。関数の呼び出しでは、パラメーターとローカル変数がスタックに格納されます。

スタックは要素のコレクションであり、一度に1つずつ格納および取得できます。要素は、格納時とは逆の順序で取得されます。つまり、格納されている最新の要素が、次に取得される要素です。スタックは、後入れ先出し(LIFO)または先入れ後出し(FILO)構造と呼ばれることがあります。以前に格納された要素は、最新の要素(通常は「トップ」要素と呼ばれる)が取得されるまで取得できません。

キュー:

キューは、同じタイプの要素のコレクションです。これは線形リストであり、リストの後方と呼ばれるリストの一端で挿入が行われ、リストの前方と呼ばれる他端でのみ削除が行われます。

キューは要素のコレクションであり、一度に1つずつ保存および取得できます。要素は、格納された時間順に検索されます。つまり、最初に格納された要素が、次に取得される要素です。キューは、先入れ先出し(FIFO)または後入れ先出し(LILO)構造と呼ばれることもあります。その後格納された要素は、最初の要素(通常は「フロント」要素と呼ばれます)が取得されるまで取得できません。


2

スタックとキューの記述を過度に簡略化するために、どちらもチェーンの一方の端からアクセスできる情報要素の動的チェーンであり、それらの間の唯一の実際の違いは次の事実です。

スタックで作業するとき

  • チェーンの一端に要素を挿入し、
  • チェーンの同じ端から要素を取得または削除します

キューで

  • チェーンの一端に要素を挿入し、
  • もう一方の端からそれらを取得/削除する

:このコンテキストでは、retrieve / removeの抽象的な表現を使用しています。これは、要素をチェーンから取得する場合や、ある意味で要素を読み取るかその値にアクセスする場合がありますが、要素を要素から削除する場合もあります。チェーンと最後に、同じ呼び出しで両方のアクションを実行する場合があります。

また、エレメントという単語は、架空のチェーンを可能な限り抽象化し、特定のプログラミング言語の用語から切り離すために意図的に使用されています。elementと呼ばれるこの抽象的な情報エンティティは、言語に応じて、ポインタ、値、文字列または文字、オブジェクトなど、何でもかまいません。

ほとんどの場合、実際には値またはメモリの場所(つまりポインタ)です。そして、残りはこの事実を言語専門用語の背後に隠しているだけです<

キューは、要素の順序が重要で、要素が最初にプログラムに入ったときとまったく同じである必要がある場合に役立ちます。たとえば、オーディオストリームを処理するときや、ネットワークデータをバッファするときなどです。または、任意のタイプのストアアンドフォワード処理を行う場合。これらのすべてのケースで、要素のシーケンスをプログラムに入ったときと同じ順序で出力する必要があります。そうしないと、情報が意味をなさなくなる可能性があります。そのため、入力からデータを読み取り、処理を実行してキューに書き込む部分と、キューからデータを取得して別のキューに格納し、さらに処理または送信する部分でプログラムを分割できます。 。

スタックは、プログラムの直接のステップで使用される要素を一時的に格納する必要がある場合に役立ちます。たとえば、プログラミング言語は通常、スタック構造を使用して変数を関数に渡します。彼らが実際に行うことは、関数の引数をスタックに格納(またはプッシュ)してから、関数にジャンプして、スタックから同じ数の要素を削除および取得(またはポップ)します。このように、スタックのサイズは、関数のネストされた呼び出しの数に依存します。さらに、関数が呼び出されてその機能が終了すると、スタックは呼び出される前とまったく同じ状態になります。このようにして、他の関数がスタックで動作する方法を無視して、任意の関数がスタックで動作できます。

最後に、同じような類似の概念には他にも使用されている用語があることを知っておく必要があります。たとえば、スタックはヒープと呼ばれます。これらの概念のハイブリッドバージョンもあります。たとえば、両端キューは、両端から同時にアクセスできるため、スタックとキューとして同時に動作できます。さらに、データ構造がスタックまたはキューとして提供されるという事実は、それが必ずしもそのように実装されていることを意味するわけではなく、データ構造を任意のものとして実装し、特定のものとして提供できる場合があります。データ構造は、単にそのように動作させることができるためです。つまり、データ構造にプッシュとポップのメソッドを提供すると、それらは魔法のようにスタックになります!


コードではないテキストにコード形式を使用しないでください。
ローン侯爵

1

STACKはLIFO(後入れ先出し)リストです。は、3つの要素、つまり10,20,30がスタックに挿入されると仮定します。10が最初に挿入され、30が最後に挿入されるため、30が最初にスタックから削除され、10が最後にスタックから削除されます。これはLIFOリスト(後入れ先出し)です。

キューはFIFOリスト(先入れ先出し)です。つまり、最初に削除される要素が最初に挿入されます。例:人々のキュー。


1

考慮された垂直コレクションをスタックします。最初に、コレクションは他の小さなオブジェクトを収集および整理するオブジェクトであることを理解します。これらの小さいオブジェクトは、一般的に要素と呼ばれます。これらの要素は、Aが最初でCが最後のABC順序でスタックに「プッシュ」されます。垂直方向は次のようになります:3番目の要素が追加されました)C 2番目の要素が追加されました)B 1番目の要素が追加されました)A

スタックに最初に追加された「A」が一番下にあることに注意してください。スタックから「A」を削除する場合は、最初に「C」、次に「B」、最後にターゲット要素「A」を削除する必要があります。スタックは、スタックの複雑さを処理するときにLIFOアプローチを必要とします。(後入れ先出し)スタックから要素を削除すると、正しい構文がポップされます。スタックから要素を削除せず、「ポップ」します。

「A」はスタックにプッシュされた最初の要素であり、「C」はスタックにプッシュされた最後の項目であることを思い出してください。スタックの一番下にあるものを確認したい場合は、3つの要素がスタック上にあり、Aが最初のB、2番目がC、3番目の要素が3番目の要素の順になっている場合、上部をポップしてからスタックの下部を表示するために追加された2番目の要素。


質問をフォーマットして、見やすく、読みやすくしてください。
Neeku 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.