目次
1. スタックの基本概念
スタック:固定端の要素の挿入と削除のみを許可する特別な線形リスト。データの挿入および削除操作が実行される一方の端を
スタックの最上部と呼び、もう一方の端をスタックの最下部と呼びます。スタック内のデータ要素は、LIFO (Last In First Out)の原則に従います。プッシュ (プッシュ) : スタックの挿入操作はプッシュ/プッシュ/プッシュと呼ばれ、受信データはスタックの先頭にあります。スタックのポップ (スタックのポップ) : スタックの削除操作をスタックのポップと呼びます。出力データもスタックの最上位にあります
2. スタックの基本構造
データの一部を挿入するときに、挿入が成功すると、そのデータがスタックの最上位要素になります。
スタックにプッシュされる最初の要素は、スタックの一番下の要素です。
スタックに最初にプッシュされた要素は、スタックの最下位にプッシュされます。要素を取り出す必要がある場合、スタックの最下位の要素よりも先に取り出せるのは、当然、スタックの最下位より上の要素だけです。取り出すことができます。
3. スタックの実装
スタックの実装は 2 つの方法に分かれています。 1. 配列の実装 2. リンク リストの実装
どちらの実装にも一長一短がありますが、相対的に配列の実装の方が優れていると思います リンクリストを使用すると、スタックにプッシュするたびにスペースを適用する必要があり、スタックからポップアウトするときにスペースを解放する必要がありますスタックはスタックに格納されますが、配列は容量がいっぱいになったときにのみ埋める必要があります。拡張する場合、最も重要なことは、配列の物理構造が連続していることです。キャッシュを計算する場合、ヒット率が高く、読み取り効率が高くなります。より高い。
リンクリストの実装はスタックの最後に挿入する方法とスタックの最後に削除する方法の 2 つの方法に分かれます。2 つ目は、ヘッドがスタックに挿入され、スタックが削除されるときにヘッドが削除される場合です。
相対的に言えば、2 番目の方法の方が優れています。これは、末尾の挿入と末尾の削除では毎回末尾を見つける必要があり、計算量が O(n) であるのに対し、先頭の削除と先頭の挿入では末尾を見つける必要がなく、時間がかかるためです。複雑さは O(1 )
さて、リンクリストによるスタックの実装については割愛しますが、今日の話の主な内容は配列によるスタックの実装です。
配列はスタックを実装しており、スタックにプッシュする場合は以前に配列表を実装したときの末尾挿入、ポップアウトする場合は配列表の末尾削除に相当します。 、時間計算量は O(1) です。
以下の図から、スタックの一番下にある要素が常に最初に挿入される要素であることがわかります。要素がスタックにプッシュされると、スタックの一番上がその要素の位置になります。スタックからポップアウトされると、スタックの先頭がこの要素の前の要素になります
要約すると、スタックの最上位要素は実際には配列の最後の要素です。
配列によるスタックの実装は言葉でほぼ完了しました。今度はコードで実装してみましょう。
1. 関連するインターフェース機能
2. 構造を定義する
3. 初期化
top==0 を初期化します。この時点で、top はスタック内の要素の数を示し、スタック内の先頭要素の次の位置も示します。つまり、[ top-1] はスタック内の先頭要素を示します。
4. スタックにプッシュします
スタックにプッシュする際、スタックが満杯かどうかを判断し、満杯の場合は容量を拡張する必要がある
5. スタックが空かどうかを確認します。
トップがゼロの場合、スタックは空です
6. 飛び出す
下図のスタックの先頭要素を取得するには、スタックが空のときのデータ[-1]位置へのアクセス(不正アクセス)を防ぐためにアサートする必要があります。
次の図に示すように、スタックからのポップアウトがスタックの最上位要素の取得と組み合わせて使用されること を宣言します。
この時点で、スタックの最上位要素が取得され、スタックからポップアウトされます。
7. スタック内の要素の数を取得します。
8. スタックの破壊
スタックに関する知識の共有はこれで終わりです。役に立ったと思われましたら、「いいね!」をお願いします。
改善の余地はありますか、皆さんに指摘していただければ幸いです
886!