私は最近学習を始めましたデータ構造最近、自分のlinked list
実装。
ここで、2つの新しいデータ構造、stack
とqueue
に遭遇しました。
これまでに学んだことからstack
はlinked list
尾部からのみ挿入/除去を許可します。queue
はlinked list
これにより、尾部にのみ挿入し、頭からのみ除去することができます。
私の質問は:
通常の代わりにこれら2つのデータ構造を使用する理由linked list
どこからでも挿入と削除ができますか?
また、これらの2つのデータ構造が「制限付きアクセスリンクリスト」ではなく、独立したデータ構造として分類されるのはなぜですか?
スタックとキューには、独自の存在理由があります。スタックはFILO(先入れ先出し)またはLIFO(いずれかの方法))データ構造であり、配列、リンクリスト、またはその他のフォームを使用して実装できます。ブラウザの履歴を検討してください。 サイトA->その後[〜#〜] b [〜#〜]->その後[〜#〜] c [〜#〜]- > [〜#〜] d [〜#〜]。ユーザーが先に進むと、最初にPush(挿入先tail)ウェブサイトのリスト。これにより、現在のサイトが常にスタックの一番上にあることが保証されます。
次に、ユーザーが戻るボタンを押すと、最後にアクセスしたpopが一番上(末尾から削除-挿入に使用されたのと同じ端)に表示されますサイト-[〜#〜] c [〜#〜]。したがって、先入れ先出し(つまりSite A)とラストアウト(最後に入るのはSite Dでした)の概念が、次に最初に出るようになります)
FIFO(先入れ先出し)のキューについても同様です。ジョブキューの例を検討してください。ジョブを実行するときは、(最適化アルゴリズムを考慮せずに)最初に処理しますこれにより、キューは、先着順でジョブを処理するための優れたデータ構造になります。
どちらの場合も、任意のインデックスで要素を任意に削除または挿入する必要はありません。いいえ、それは望ましくない振る舞いをもたらすでしょう。したがって、スタック/キューの必要性。リンクリストに制限を適用することでスタック/キューを実装できることを再度強調します。
画質が悪いので申し訳ありません。ペイントで描きました。
スタックは基本的には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です。