Pythonキュー:FIFOとLIFOを実例で理解
Pythonキュー:FIFOとLIFOを実例で理解
キューはアイテムを線形順序で格納するデータ構造です。アイテムは後端(リア)に追加され、前端(フロント)から取り出され、**先入れ先出し(FIFO)**の原則に従います。キューには論理的な2つの端、**フロント**と**リア**があり、リアで*エンキュー*、フロントで*デキュー*を行います。
このチュートリアルで学べること:
- Pythonの
queueモジュールの仕組み - Pythonで利用可能なキューの種類
- モジュールのインポート方法
QueueとLifoQueueオブジェクトの主要メソッド- FIFOとLIFOキューの実践例
- バッチ操作、ソート、キューの反転
キュー モジュールの仕組み
振る舞いは物理的な行列と類似:最初に並んだ人が最初にサービスを受けます。キュー データ構造では、最初にエンキューされた要素が最初にデキューされます。

リアは新しいアイテムの挿入ポイント(例: 値7)。フロントはアイテムがキューを離れるポイント;最初のアイテムを削除すると値1が得られます。
キューは線形なので、中央の任意の要素を直接削除できません;先にあるすべての要素をデキューする必要があります。

Pythonのキューの種類
Pythonのqueueモジュールには2つの主要なキュー クラスがあります:
- FIFOキュー –
Queue()を使用。最古のアイテムが常に最初に削除されます。 - LIFOキュー –
LifoQueue()を使用。最も最近追加されたアイテムが最初に返されます。
始め方: モジュールのインポート
Pythonにはqueueモジュールが標準搭載;外部インストール不要。
import queue
FIFOキューのインスタンス化:
q1 = queue.Queue()
LIFOキューのインスタンス化:
q1 = queue.LifoQueue()
主要メソッド
QueueとLifoQueueは同じコア APIを公開:
put(item)– アイテムをエンキューget()– 次のアイテムをデキューして返すempty()– キューが空ならTruefull()– キューが最大サイズに達したらTrueqsize()– 現在のアイテム数を返す
FIFOキューの例
単一アイテムのエンキュー
import queue q1 = queue.Queue() q1.put(10) # 10をキューに追加
サイズ制限付き複数アイテムのエンキュー
q1 = queue.Queue(maxsize=5) # 最大5アイテム
for i in range(1, 6):
q1.put(i)
print(q1.full()) # → True
出力:
True
アイテムのデキュー
item = q1.get()
print('デキューされたアイテム:', item)
出力:
デキューされたアイテム: 10
LIFOキューの例
単一アイテムのエンキュー
q1 = queue.LifoQueue() q1.put(10)
アイテムのデキュー
item = q1.get()
print('LIFOからデキュー:', item)
出力:
LIFOからデキュー: 10
バッチ操作
FIFO – 20個の数値をエンキュー
q1 = queue.Queue()
for i in range(20):
q1.put(i)
FIFO – 全デキュー
while not q1.empty():
print('値:', q1.get())
出力:
値: 0 値: 1 ... 値: 19
LIFO – 20個の数値をエンキュー
q1 = queue.LifoQueue()
for i in range(20):
q1.put(i)
LIFO – 全デキュー
while not q1.empty():
print('値:', q1.get())
出力:
値: 19 値: 18 ... 値: 0
キューのソート(バブルソート)
q1 = queue.Queue()
for item in [11, 5, 4, 21, 3, 10]:
q1.put(item)
n = q1.qsize()
for i in range(n):
x = q1.get()
for j in range(n-1):
y = q1.get()
if x > y:
q1.put(y)
else:
q1.put(x)
x = y
q1.put(x)
while not q1.empty():
print(q1.queue[0], end=' ')
q1.get()
出力:
3 4 5 10 11 21
再帰を使ったキューの反転
def reverse_queue(src, dest):
item = src.get()
if not src.empty():
reverse_queue(src, dest)
dest.put(item)
return dest
q1 = queue.Queue()
for item in [11, 5, 4, 21, 3, 10]:
q1.put(item)
q2 = queue.Queue()
reverse_queue(q1, q2)
while not q2.empty():
print(q2.queue[0], end=' ')
q2.get()
出力:
10 3 21 4 5 11
クイックサマリー
- Pythonの
queue.QueueはFIFO、queue.LifoQueueはLIFOを実装 - エンキューに
put()、デキューにget()を使用 - 両クラスとも
empty()、full()、qsize()で状態確認可能 - FIFOキューに最大サイズを設定可能;超えて
put()するとスペースが空くまでブロック - ソートと反転は標準アルゴリズムで可能だが、
collectionsのdequeの方が柔軟なことが多い
Python
- FIFOとLIFO:主な違い、メリット・デメリット、実践的応用
- Python 演算子完全マスター: 包括的ガイド
- Pythonリスト操作:作成、アクセス、変更、高度なテクニック
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python strip()メソッド完全ガイド:実践例付き
- Python len()関数:オブジェクトの長さを測る実践ガイド
- Python yieldをマスター:ジェネレータvs return – 実践ガイド
- Python collections.Counter:効率的なカウント、更新、演算操作
- Python enumerate()をマスター:リスト、タプル、文字列、辞書でインデックス付きループ
- Python time.sleep():コードに遅延を追加する方法(例付き)
- Python list.index():要素の位置を検索する実践ガイド