1. [1] + enq 5, enq 3, deq -> [5,3]
  2. [1,2] + enq 3, deq, deq -> [3]
  3. [1,2] + many deq -> []
  4. no operations -> initial unchanged
  5. [0] + enq 1, enq 2, enq 3, deq -> [1,2,3]
  6. deq all then enq -> [42]
コース一覧
コンピューターサイエンス入門:理論編
キュー (enqueue / dequeue) を実装する

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

キュー (enqueue / dequeue) を実装する

割り込みされたら、その列は成立しない

窓口に整理券を持った人が 5 人並んでいます。ここでいちばんあとに来た人を先に呼んだら、苦情が出ます。列というのは 先に来た人から順に処理する という約束があるから成り立っています。

プリンタの印刷待ち、注文の処理待ち、メッセージの配送待ち。順番を守ることが仕様そのものになっている場面はいくらでもあります。この「先に入れたものが先に出る」並べ方を キュー と呼びます。

入るのは末尾、出るのは先頭

キューでは、追加と取り出しで触る場所が違います。新しく来た人は最後尾に付き、呼ばれるのは先頭にいる人です。

Python

waiting = [] waiting.append("整理券 12 番") waiting.append("整理券 13 番") print(waiting[0]) # 整理券 12 番 次に呼ばれるのはこの人 waiting.pop(0) print(waiting) # ['整理券 13 番']

append で末尾に追加し、pop(0) で先頭を取り出します。JavaScript なら push と shift です。配列の左端が古い人、右端が新しい人。この向きを最後まで崩さないことが、混乱しないコツです。

先頭を 1 人抜くと、全員が 1 つずつ詰める

配列で列を作ると、取り出しに手間がかかります。先頭の 1 つを抜いたあと、残り全員の位置が 1 つずつ前へずれるからです。

Python

waiting = list(range(100000)) waiting.pop(0) # 残り 99999 個を 1 つずつ前へ詰め直す

追加は末尾なので一定時間で終わりますが、取り出しは並んでいる人数に比例します。数千件までなら気になりません。それ以上を高速に流したい場面では、両端を同じ速さで触れる専用の構造に置き換えます。

誰も並んでいない列から、呼び出す

行列がはけたあとに次の人を呼ぼうとすると、当然ながら誰もいません。

Python

waiting = [] waiting.pop(0) # IndexError: pop from empty list

空のときにどう振る舞うかは、仕様として決めておく必要があります。何もせず素通りするのか、エラーにするのか。決めないまま書くと、言語ごとの既定の振る舞い任せになり、あとから追いにくい不具合になります。

そしてもう 1 つ、取り出す側を間違えないことです。末尾から取ってしまうと、あとから来た人が先に呼ばれることになり、それはもう列ではありません。

要件

  1. operations の各要素は ['enq', N] (N は整数) か ['deq'] のいずれか
  2. 空キューに対する deq は何もせず無視する
  3. 戻り値は最終的なキュー状態を表す整数配列 (先頭が古い、末尾が新しい)

入出力例

queueOps([1], [["enq",5],["enq",3],["deq"]]) → [5,3] queueOps([1,2], [["enq",3],["deq"],["deq"]]) → [3] queueOps([1,2], [["deq"],["deq"],["deq"],["deq"]]) → [] queueOps([7,8,9], []) → [7,8,9] queueOps([0], [["enq",1],["enq",2],["enq",3],["deq"]]) → [1,2,3] queueOps([10,20], [["deq"],["deq"],["deq"],["enq",42]]) → [42]

ヒント

配列の末尾を新しい側、先頭を古い側にする。enq は末尾追加、deq は先頭削除

Python なら queue.append(x) / queue.pop(0)、JS なら queue.push(x) / queue.shift()

initial を直接書き換えないように、最初にコピーを作ってから操作する

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • カッコのバランス判定 (スタック応用)

    スタックを使い、`(){}` `[]` 混在の文字列が正しいネスト構造になっているか判定する。

  • set で重複を除去する

    set を使って、整数配列から重複を取り除き、昇順ソート済みの配列を返す。

  • map で出現回数を数える

    ハッシュマップ (dict / Map) を使って、整数配列の各値の出現回数を 1 パスで集計する。

  • 二数の和 (map で O(n))

    配列の中から和が target となる 2 つの要素のインデックスを map を使って O(n) で見つける。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 処理計算や代入を表す長方形
  • キュー先入れ先出し(FIFO)のデータ構造
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 配列サイズ固定の同型データの集まり
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

キュー (enqueue / dequeue) を実装する

⌘S で保存