web-dev-qa-db-ja.com

スタック、キュー、リンクリスト

私は最近学習を始めましたデータ構造最近、自分のlinked list実装。

ここで、2つの新しいデータ構造、stackqueueに遭遇しました。
これまでに学んだことから
stacklinked list尾部からのみ挿入/除去を許可します。
queuelinked listこれにより、尾部にのみ挿入し、頭からのみ除去することができます。

私の質問は:
通常の代わりにこれら2つのデータ構造を使用する理由linked listどこからでも挿入と削除ができますか?
また、これらの2つのデータ構造が「制限付きアクセスリンクリスト」ではなく、独立したデータ構造として分類されるのはなぜですか?

10
Hamed Khaled

スタックとキューには、独自の存在理由があります。スタックはFILO(先入れ先出し)またはLIFO(いずれかの方法))データ構造であり、配列、リンクリスト、またはその他のフォームを使用して実装できます。ブラウザの履歴を検討してください。 サイトA->その後[〜#〜] b [〜#〜]->その後[〜#〜] c [〜#〜]- > [〜#〜] d [〜#〜]。ユーザーが先に進むと、最初にPush(挿入先tail)ウェブサイトのリスト。これにより、現在のサイトが常にスタックの一番上にあることが保証されます。 Stack in action

次に、ユーザーが戻るボタンを押すと、最後にアクセスしたpopが一番上(末尾から削除-挿入に使用されたのと同じ端)に表示されますサイト-[〜#〜] c [〜#〜]。したがって、先入れ先出し(つまりSite A)とラストアウト(最後に入るのはSite Dでした)の概念が、次に最初に出るようになります)

FIFO(先入れ先出し)のキューについても同様です。ジョブキューの例を検討してください。ジョブを実行するときは、(最適化アルゴリズムを考慮せずに)最初に処理しますこれにより、キューは、先着順でジョブを処理するための優れたデータ構造になります。

どちらの場合も、任意のインデックスで要素を任意に削除または挿入する必要はありません。いいえ、それは望ましくない振る舞いをもたらすでしょう。したがって、スタック/キューの必要性。リンクリストに制限を適用することでスタック/キューを実装できることを再度強調します。

画質が悪いので申し訳ありません。ペイントで描きました。

19
Slartibartfast

スタックは基本的にはLIFO(LAST IN FIRST OUT)に続くデータ構造です。キューはFIFO(FIRST IN FIRST OUT)に続くものです。

一般に、StacksおよびQueuesは、ArraysおよびLinked Listsを使用して実装できます。

Stackの実装にLinked Listを使用する理由は、LAST IN FIRST OUTフォームに関連する機能が必要であり、その機能に必要な要素の数がわからない場合です。したがって、要件に応じてノードを動的に作成するLinkedListを使用します。

Queuesも同様です

両方が独立している理由は、両方が異なる原則に従っているためです。つまり、LIFOおよびFIFOです。

3
yyk