This commit is contained in:
krahets
2026-04-03 18:46:15 +08:00
parent 377736b1bd
commit 9d21ca86b0
352 changed files with 46563 additions and 11262 deletions
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -9,9 +9,9 @@ icon: material/stack-overflow
!!! abstract
スタックは積み重ねられた猫のようなもので、キューは列に並んだ猫のようなものです。
それらはそれぞれ、後入先出LIFOと先入先出FIFOの論理関係を表しています。
スタックは猫を積み重ねようなもので、キューは猫が列に並ようなものです。
両者はそれぞれ、後入先出と先入先出の論理関係を表します。
## 章の内容
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+17 -17
View File
@@ -4,32 +4,32 @@ comments: true
# 5.4   まとめ
### 1.   重要なポイント
### 1.   要点の振り返り
- スタックは後入れ先出しLIFOの原則に従うデータ構造で、配列または連結リストを使って実装できます。
- 時間効率の観点では、スタックの配列実装の方が平均的な効率が高いです。ただし、拡張時には単一のプッシュ操作の時間計算量が$O(n)$に悪化する可能性があります。対照的に、スタックの連結リスト実装はより安定した効率を提供します。
- 空間効率に関しては、スタックの配列実装は一定程度の空間の無駄につながる可能性があります。ただし、連結リストのノードが占有するメモリ空間は一般的に配列要素よりも大きいことに注意することが重要です。
- キューは先入れ先出しFIFOの原則に従うデータ構造で、同様に配列または連結リストを使って実装できます。キューの時間と空間効率に関する結論は、スタックと似ています。
- 両端キュー(deque)はより柔軟なキューの種類で、両端で要素の追加と削除を可能にします。
- スタックは後入れ先出しの原則に従うデータ構造であり、配列または連結リスト実装できます。
- 時間効率のでは、スタックの配列実装は平均効率が高い一方、拡張時には 1 回のプッシュ操作の時間計算量が $O(n)$ まで悪化します。これに対して、スタックの連結リスト実装はより安定した効率をします。
- 空間効率の面では、スタックの配列実装はある程度の領域の無駄を生む可能性があります。ただし、連結リストのノードが占有するメモリ配列要素よりも大きいに注意が必要です。
- キューは先入れ先出しの原則に従うデータ構造であり、同様に配列または連結リスト実装できます。時間効率と空間効率の比較における結論は、前述のスタックの場合と似ています。
- 両端キューはより高い自由度を持つキューであり、両端で要素の追加と削除を行えます。
### 2.   Q & A
**Q**: ブラウザの進む・戻る機能は双方向連結リストで実装されているのですか?
**Q**ブラウザの進む・戻るは双方向連結リストで実装されているのですか?
ブラウザの進む・戻るナビゲーションは本質的に「スタック」概念の現れです。ユーザーが新しいページを訪問すると、そのページスタックの先頭に追加されます。戻るボタンをクリックすると、ページスタックの先頭からポップされます。両端キュー(deque)は、「両端キュー」の章で述べたように、いくつかの追加操作を便利に実装できます。
ブラウザの進む・戻る機能の本質は「スタック」の表れです。ユーザーが新しいページにアクセスすると、そのページスタックの先頭に追加されます。ユーザーが戻るボタンをクリックすると、そのページスタックの先頭から取り出されます。両端キューを使うといくつかの追加操作を簡単に実装でき、この点は「両端キュー」の章で触れています。
**Q**: スタックからポップした後、ポップされたノードのメモリを解放する必要ありますか?
**Q**ポップした後、そのノードのメモリを解放する必要ありますか?
ポップされたノードが後で使用される場合は、そのメモリを解放する必要はありません。自動ガベージコレクションを持つJavaやPythonなどの言語では、手動メモリ解放必要ありません。CやC++では手動メモリ解放が必要です。
後で取り出したノードを引き続き使うのであれば、メモリを解放する必要はありません。以降そのノードを使わない場合でも、`Java``Python` などの言語には自動ガベージコレクション機構があるため、手動メモリ解放する必要ありません。一方、`C``C++` では手動メモリ解放する必要があります。
**Q**: 両端キューは2つのスタックを結合したもののように見えます。その用途は何ですか?
**Q**両端キューは 2 つのスタックをつなげたように見えますが、用途は何ですか?
両端キューは、スタックとキューの組み合わせまたは2つのスタックを結合したもので、スタックキューの両方のロジックを示します。したがって、スタックとキューのすべてのアプリケーションを実でき、より大きな柔軟性を提供します。
両端キューは、スタックとキューの組み合わせ、あるいは 2 つのスタックをつなげたもののような構造です。表しているのはスタック + キューのロジックなので、スタックとキューのすべての応用を実でき、しかもより柔軟です。
**Q**: 元に戻すとやり直しは具体的にどのように実装されるのですか?
**Q**:取り消し(undo)とやり直し(redo)は具体的にどのように実装されすか?
元に戻すとやり直しの操作は2つのスタックを使って実装されます:元に戻す用のスタック`A`とやり直し用スタック`B`す。
2 つのスタックを使い、スタック `A` を取り消し用スタック `B` をやり直し用に使います。
1. ユーザーが操作を実行するたびに、それがスタック`A`にプッシュされ、スタック`B`がクリアされます。
2. ユーザーが「元に戻す」を実行すると、最新の操作がスタック`A`からポップされ、スタック`B`にプッシュされます。
3. ユーザーが「やり直し」を実行すると、最新の操作がスタック`B`からポップされ、スタック`A`に戻されます。
1. ユーザーが操作を 1 つ実行するたびに、その操作をスタック `A` にプッシュ、スタック `B` を空にします。
2. ユーザーが「取り消し」を実行したときは、スタック `A` から直近の操作をポップし、それをスタック `B` にプッシュます。
3. ユーザーが「やり直し」を実行したときは、スタック `B` から直近の操作をポップし、それをスタック `A` にプッシュします。